シーザー暗号を解くPHPスクリプト

暗号技術入門 第3版 秘密の国のアリス

『暗号技術入門』を読んでいたら、以下の練習問題がありました。

シーザー暗号で暗号化された、次の暗号文があなたの手に入りました。鍵(ずらしている文字数)はわかりません。この暗号を解読してください。
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;

コメントを残す

コメントを残す