先日、シーザー暗号の暗号化と復号化をpythonで実装しました。今回は、シーザー暗号に対する攻撃を実装します。
シーザー暗号解読の方針
シーザー暗号はアルファベットを任意の数ずらすことで暗号化をする仕組みです。この「任意の数」をいくつに設定するかが暗号化キー、そして復号化キーになっていると考えることができます。
しかし、アルファベットは26文字しかありません。したがってずらし方も26通りしかありません(0文字ずらし意味無いので実質25通りですが)。
このくらいなら余計なことを考えず、26パターンすべてを試してしまえば問題なく解読できます。
実装例:python3によるシーザー暗号へ攻撃
def CC_attack(cipher_text):
list = [] #結果を格納するリスト
for key in range(26): #key=0~25をすべて試す
result = ""
for char in cipher_text:
code = ord(char)
if 97 <= code and code <= 122: #小文字の場合
n = code - 97
n = (n - key) % 26
code = n + 97
result += chr(code)
if 65 <= code and code <= 90: #大文字の場合
n = code - 65
n = (n - key) % 26
code = n + 65
result += chr(code)
list.append(result)
return list
このプログラムはcipher_text(暗号文)を入力すると、シーザー暗号の場合に平文の候補となる26パターンをすべて出力します。
3行目の「for key in range(26):」でループを作り、ずらす数(key)が0~25の場合をすべて試します。
for分の中身(4行目~16行目)は、以前記事にしたシーザー暗号の復号化のプログラムとほぼ同じです。詳細な解説についてはそちらをご覧ください。
実行例
次のようなプログラムを実行してみます。暗号文「Dssoh」に対して解読を仕掛けます。
c = 0
list = CC_attack("Dssoh")
for text in list:
print("key=" + str(c) + " → " + text)
c+=1
key=0 → Dssoh
key=1 → Crrng
key=2 → Bqqmf
key=3 → Apple
key=4 → Zookd
key=5 → Ynnjc
key=6 → Xmmib
key=7 → Wllha
key=8 → Vkkgz
key=9 → Ujjfy
key=10 → Tiiex
key=11 → Shhdw
key=12 → Rggcv
key=13 → Qffbu
key=14 → Peeat
key=15 → Oddzs
key=16 → Nccyr
key=17 → Mbbxq
key=18 → Laawp
key=19 → Kzzvo
key=20 → Jyyun
key=21 → Ixxtm
key=22 → Hwwsl
key=23 → Gvvrk
key=24 → Fuuqj
key=25 → Ettpi
26個の平文候補をちゃんと出力できています。この中で意味が通るのApple(key=3)だけです。したがって、Appleが正しい平文であると推測できます。
シーザー暗号への攻撃プログラム:まとめ
今回はシーザー暗号への攻撃プログラムを実装しました。シーザー暗号はアルファベットをずらすことで暗号化を行いますが、暗号化のパターンは26通りしかありません。なので簡単に攻撃を行うことが可能です。そのため、現在において実用性は皆無です。
暗号プログラムを実装することはあるかもしれませんが、攻撃プログラムを書くことはなかなか珍しいと思います。攻撃プログラムを実際に書いてみることで、ハッカー側の立場を体験することができ、セキュリティへの理解を深められると思います。他にもいろいろ書きたいですね。