『暗号技術入門』を読んでいたら、以下の練習問題がありました。
シーザー暗号で暗号化された、次の暗号文があなたの手に入りました。鍵(ずらしている文字数)はわかりません。この暗号を解読してください。
PELCGBENCUL
シーザー暗号なので手計算でも十分ですが、面倒くさいのでプログラムで解きます。
<?php
print_r(Caesar::bruteForce('PELCGBTENCUL'));
class Caesar
{
/**
* @var string
*/
private static $chars = 'abcdefghijklmnopqrstuvwxyz';
/**
* @param string $cipher
* @return array
*/
public static function bruteForce($cipher)
{
$result = [];
for ($i = 0; $i < 26; $i++) {
$result[] = self::decrypt($cipher, $i);
}
return $result;
}
/**
* @param string $cipher
* @param int $key
* @return string
*/
public static function decrypt($cipher, $key)
{
$cipher = strtolower($cipher);
$plain = '';
$charsLen = strlen(self::$chars);
for ($i = 0, $len = strlen($cipher); $i < $len; $i++) {
$next = strpos(self::$chars, $cipher[$i]) + (int)$key;
if ($next >= $charsLen) {
$next -= $charsLen;
}
$plain .= self::$chars[$next];
}
return $plain;
}
}
なお、ネタバレになってしまいますが、この暗号文の鍵は「13」なので、PHPのstr_rot13関数を使うと、1行で解けます。
<?php
echo str_rot13('PELCGBTENCUL'), PHP_EOL;