プログラミング初心者の雑記帳など

2024年7月6日土曜日

古典暗号解析

  今回は暗号解析についてです。


 前回の投稿でも少し触れましたが、古典暗号はコンピュータを用いることで簡単に解読できます。もちろん人力でもがんばれば(時間はかかりますが)解析可能です。



総当たり攻撃(ブルートフォース攻撃)

 一番単純な攻撃です。その名の通りすべての組み合わせを試していきます。(ものすごい時間がかかりますが)確実に解読できる方法です。現代暗号ではあまり効果を見込めませんが、シーザー暗号などの古典暗号であれば有効な攻撃方法になります。なぜなら古典暗号は暗号鍵の大きさがそれほど大きくないからです。例えばシーザー暗号では鍵が文字の種類に大きく依存します。アルファベットであれば26文字なので、25種類(1~25)しか鍵が存在しないことになります。日本語であればかな・カナ・漢字を組み合わせれば大きな数になりますがそれでもコンピュータでの総当たりにそこまで時間をかけずに解読できます。(そこまでしてシーザー暗号は使いませんが)

では詳細になります。以下のような暗号文があったとします。


この暗号文がシーザー暗号であることが分かっているとします。この時、アルファベットの小文字のみであることから鍵は1以上25以下であると推測できます。この範囲で総当たりで解析すると次のようになります。keyが鍵です。0も参考で載せていますが意味はありません。


この中で意味のある平文はhelloworldのみなので、鍵は3だとわかります。時間を見ると、総当たりでもコンピュータで解読すると1秒もかからないので、シーザー暗号は(当たり前ですが)安全でないことがわかります。


頻度分析攻撃

 暗号文に出現する文字の頻度から平文を推定する攻撃方法です。古典暗号では平文の文字と暗号文の文字が一対一で対応するため、暗号文に出現する文字と対応する平文の文字の出現頻度は一致することになります。

 例えば、英語のアルファベットの出現頻度は次のようになります。


[CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=551867]


この分布のようにe,t,o,..と頻度が高い順に暗号文と対応させて解析する方法です。

以下のように暗号文があったとします。


この暗号文のアルファベットの出現頻度は次のようになります。


 この分布と上のアルファベット全体の分布と対応させて解析していきます。uが多いため、uとeを対応させます。同様にaやjも当てはめていき、意味のある文章とならなければまた次を考えていきます。換字式暗号で暗号がほかの記号や数字になっている場合もこれと同様に考えることができます。
 この解析法はある程度長い暗号文では有効になります。そのため今回の暗号文ではあまり有効ではありません(これくらいなら総当たりのほうが早いです)。


ほかにもヴィジュネル暗号限定ですがカシスキー・テストという、暗号文中に出現する文字列の出現頻度から鍵を推定する方法もあります。古典暗号は現代ではほとんど使われることはありませんが、CTF(Capture The Frag)などではよく出てくる内容になります。


今回はソースコードの公開はありません。参考にした文献は以下の通りです。

Pythonでいかにして暗号を破るか Al Sweigart著 IPUSIRON訳


0 件のコメント:

コメントを投稿