PHPでシーザー暗号(ROT)を使ってみる!
こんにちは!keitaです。
もう9月になってるんですね!本当に時間がたつのがはやい(-_-;)
最近立て込んでまして、ブログの更新に間をあけてしまいました。。
今回は、PHPでシーザ暗号の一つといわれている、ROTという暗号を使ってみようと思います!
ROT暗号とは
シーザー暗号(単換字式暗号)の一つで、アルファベットを一文字毎に指定された値をずらすという暗号になっています!
基本的にはROT13といわれ、文字を13文字ずらすのが主流だと思います!
というのもアルファベットは26文字あるので、前半13文字と後半13文字を入れ替えるという方法になります。
とROT暗号に関してはこんな感じです。
少し話が逸れますが、
今回PHPを採用したのは、私がPHPをほかの言語に比べて使い慣れているという点もありますが、PHPにはROTの関数が用意されているという点が大きいです。
暗号に関しては、用意してもらっているものを使用した方がいいと思っています!
なので、今回はPHPでいきます!
用意されている関数
このようにROT13の機能が用意されています!
参考:PHP: str_rot13 - Manual
str_rot13 (文字列
$string
):文字列引数に対して ROT13 エンコーディングを実行し
string
、結果の文字列を返します。ROT13 エンコーディングは、すべての文字をアルファベットの 13 桁だけシフトするだけで、非アルファベット文字はそのままにします。エンコードとデコードは同じ関数によって行われ、エンコードされた文字列を引数として渡すと元のバージョンが返されます。
しかし、今回は13以外の数字も触ってみたいので下記を使用させてもらおうと思います!
<?php
function str_rot($s, $n = 13) {
static $letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$n = (int)$n % 26;
if (!$n) return $s;
if ($n == 13) return str_rot13($s);
for ($i = 0, $l = strlen($s); $i < $l; $i++) {
$c = $s[$i];
if ($c >= 'a' && $c <= 'z') {
$s[$i] = $letters[(ord($c) - 71 + $n) % 26];
} else if ($c >= 'A' && $c <= 'Z') {
$s[$i] = $letters[(ord($c) - 39 + $n) % 26 + 26];
}
}
return $s;
}
?>
ではさっそく作成していきます!
作成したもの
値をPOSTで受け渡す一画面完結の構成にしています!
ボタン押下で、暗号化対象の文字列と暗号化された文字列を表示するようになっています!
すごく簡単ですが、こんな感じでROTを取り扱いました!
ソースはこちらにあるのでよかったら見てみてください!
暗号はサービスで既存に用意してくれることが多いので、あまり気に留めず生きてきましたが、触ってみると奥深いです!
今回の暗号は簡単なものでしたが、今後はRSAやAES等の暗号も触っていけたらと思います!
ここまで読んでいただきありがとうございました。
Summarized in English
This time, I learned about ROT cipher in PHP programing language!
This cipher was simple but profound!
In the future, I will focus my learning on chiphers like RSA and AES etc.