CodeIQのクリプタン帝国の暗号を解いてみた

粘り強く挑戦したら解けて大満足。

問題

あなたはクリプタン帝国にプログラマとして雇われました。
あなたは、依頼に基づき「暗号文」二つを解読しなければなりません。
それぞれの「暗号文」にはクリプタン帝国の諜報員が入手した
《暗号プログラムの構成図》が付随していますが、十分な情報はありません。
「暗号文」二つを解読して、
暗号化する前の文章を復元することがあなたのミッションなのです!

暗号文1

問題の構成図に着目。

E[i] := SBOX(T[i])

一文字ずつ暗号化しているのを見て、頭の片隅に残っていた「頻度分析」というキーワードを引っ張り出して調べてみました。暗号文に使われているコードの種類が34種類であることを調べて、これで解けると確信しました。

アルファベットの文字頻度表を参考にして、コードを文字に置換していきました。
文字頻度表
例えば、

CB:115回→空白
9C:67回→e
BA:49回→t
…

と言った形で。

大体の文字が埋まったところで、あとは英単語の穴埋めパズルの要領で原文を推測して埋めていきました。ここが一番楽しかった。

回答チェックに使ったコードがこちらです。

実行結果

暗号文2

先日のhello world問題で興味を持ったRubySHA-1ハッシュ化&暗号コードとのXORを試行。
最初はDigest::SHA1.hexdigestを使って一文字ずつハッシュ化してたのですがうまく行かず。
Rubyのドキュメントを漁ったところ、updateメソッドで一文字ずつ対象文字を追加することができることを知り、試したらビンゴでした。
class Digest::Base

復号に使ったコードはこちら。

実行結果

感想とか

暗号解読は初めてながら、一週間かけてなんとか解けました。しかし、出題者の結城さんのツイートにもある通り、分かる人にはきっと簡単な問題なんだろうなーと。
どちらも、勉強しなおす良いきっかけになりました。