1. TOPTOP
  2. Webサービス
  3. PHP

シーザー暗号の解読で見るデバッグの重要性

|

ecoteki-image

昨日のWordBench大阪(新しいタブで開く)でPHPプログラミングにおけるデバッグの重要性を説明していたら、早速「有言実行」を迫られる事態になりました。

なんじゃこりゃ?

まずは上記の画像をご覧ください。ほとんどが意味不明なアルファベットの羅列になっています。ですが目を凝らして見ると、どこかにちゃんとした意味のある英文が出てきます。

シーザー暗号の解読

実は上記の意味不明なアルファベットの羅列は、下記の文字列を1字ずつ換字していく過程で登場した文字列の塊です。

Xrrc ba nfxvat, naq vg jvyy or tvira LBH.

このように文字列を任意の文字数で換字し、暗号化と復号化する暗号のことをシーザー暗号と言います。シーザー暗号は古代ローマのユリウス・カエサル(新しいタブで開く)が考え出したと言われる暗号方式です。

今となっては実用に耐えませんが、原理そのものは比較的現代まで使われていました。第二次世界大戦のドイツ国防軍が、シーザー暗号の原理を応用して、エニグマ(新しいタブで開く)という名前の暗号機を実戦配備していました。このエニグマ暗号機を使って、Uボートに出撃命令を出していたので、連合国軍は海上での物資輸送について大変悩まされていたそうです(Uボートの出撃時刻や水中で待機している緯度経度が全く分からなかったから)。

ちなみにこのエニグマが作成した暗号文を解読したのが、アラン・マシスン・チューリングというイギリスの数学者です。この暗号文を解読することによって連合国軍の勝利に大きく貢献したと聞きます。ひょっとしたら「チューリングマシン(新しいタブで開く)」という名前で聞いたことある人がいるかもしれませんね。

デバッグの重要性

話が逸れてしまいましたが、今回の記事のポイントはシーザー暗号でもエニグマ暗号機でもありません。重要なのは、デバッグの話です。下記のGitHubにてシーザー暗号解読のためのPHPコードを公開しています。

https://github.com/echizenyayota/php_algorithm/blob/master/chapter3-2/caesar-deciper.php(新しいタブで開く)

ご覧になった方はお気づきになると思いますが、ひどくダサいコードです。新しい変数が登場するたびにvar_dump()もしくはprint_r()を入れているからです。こんなことをしているのは、暗号解読のためのコードは、取っ替え引っ替え新しい変数が登場して、どのように値が書き換わっているのか分かりにくかったためです。

非常に不器用な例かもしれませんが、プログラミングをすることことにおいて、デバッグをしなければならない意味がご理解いただけると思います。

ちなみに…

今回はデバッグの重要性を説明するために、複雑なコードを書きましたが。PHPの組み込み関数でstr_rot13()という組み込み関数があり、それを使えば一発で解読できます。

<?php
echo str_rot13("Xrrc ba nfxvat, naq vg jvyy or tvira LBH.");

一度自分で試して見てくださいね。