はじめに
セキュリティの勉強をしており、暗号を学んだのでシーザー暗号を実装してみる。
環境
php 8.1.9
実行環境
- paiza.io
https://paiza.io/ja
シーザー暗号について
シーザー暗号とは
まず、シーザー暗号とは何かについて知らないといけない。
シーザー暗号は、古典的な暗号化手法の一つ。
この暗号の原理は非常に単純で、アルファベットの各文字を一定の数だけシフトさせることによって平文を暗号文に変換する。
具体的には、アルファベットを指定された数だけ右にずらすか、左にずらすかによって暗号化が行われる。
例えば、シフト数が3の場合、‘A’は’D’に、‘B’は’E’に、そして’Z’は’C’に変換される。
具体例
例えば下記の平文とシフト数があった場合に、暗号文は以下のようになる。
平文: "HELLO"
シフト数: 3
暗号文: "KHOOR"
このようにして、平文の各文字が指定されたシフト数だけずれた位置の文字に変換されるものとなる。
実装
手軽にPHPで実装してみた。 以下のようになる。
<?php
function encryptCaesarCipher($text, $shift) {
$result = "";
for ($i = 0; $i < strlen($text); $i++) {
$char = $text[$i];
if (ctype_alpha($char)) {
$asciiStart = (ctype_upper($char)) ? ord('A') : ord('a');
$result .= chr(($asciiStart + (ord($char) - $asciiStart + $shift + 26) % 26));
} else {
$result .= $char;
}
}
return $result;
}
function decryptCaesarCipher($text, $shift) {
return encryptCaesarCipher($text, -$shift);
}
// テスト
$message = "HelloWorld";
$shift = 3;
echo "平文: " . $message . PHP_EOL;
$encryptedMessage = encryptCaesarCipher($message, $shift);
echo "暗号化されたメッセージ: " . $encryptedMessage . PHP_EOL;
$decryptedMessage = decryptCaesarCipher($encryptedMessage, $shift);
echo "復号化されたメッセージ: " . $decryptedMessage . PHP_EOL;
HelloWorld
が平文となっており、それを暗号化したメッセージと復号化したメッセージを出力している。
ではこのコードを実行してみる。すると、以下の出力となる。
実行結果
さてこれで本当に合っているのかを手で確認してみる。
※シフト数は 3にしている。
HelloWorld -> KhoorZruog
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
↓
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
となるので、結果は
H -> K
e -> h
l -> o
l -> o
o -> r
W -> Z
o -> r
r -> u
l -> o
d -> g
※大文字と小文字は適宜読み替える。
出力は正しそうだ、復号はこれの逆をやれば良いので割愛する。
おわりに
シーザー暗号は暗号のパターンが少ないので、総当たりのプログラムを書いてしまえばすぐに平文がわかってしまう。
現代の暗号としては使えないが、古典的手法の一つとしてシーザー暗号を実装した。
解きやすいので、謎解きとかでは使われることがしばしばあるので、知っておくと良い知識だなあと思う。