Posted at

【Python】シーザー暗号


概要

暗号理論の入門として、シーザー暗号をPythonで実装します。

平文の全ての文字を特定文字数ずつシフトすることで、暗号文を作成します。

復号の際は、逆方向にシフトすることで平文を作成する。


実装


暗号化

例として、3文字文シフトして暗号文を作成する。

# 平文

PLAIN = "apple"

# 秘密鍵
KEY = 3

# 以下に、記述してください。
enc = ""

for char in list(PLAIN):
ASCII = ord(char)
num = ASCII - 97
num = (num + KEY) % 26
ASCII = num + 97
enc += chr(ASCII)

print(enc)


出力結果

dssoh


alt


復号

3文字文逆方向にシフトして、平文を作成する。

26を法とする有限体で平文と秘密鍵を減算すれば復元できる。

# 暗号文

ENC = "dssoh"

# 秘密鍵
KEY = 3

# 以下に、記述してください。
plain = ""

for char in list(ENC):
ASCII = ord(char)
num = ASCII - 97
num = (num - KEY) % 26
ASCII = num + 97
plain += chr(ASCII)

print(plain)


出力結果

apple


alt


ブルートフォース攻撃

シーザー暗号で暗号された文字列に対して、ブルートフォース攻撃をしてみる。

アルファベット27通り全てに対し、復号アルゴリズムを実行する。

# 暗号文

ENC = "dssoh"

# 以下の復号アルゴリズムを用いて、
# 秘密鍵の値を26通り全て出力してみよう!
for KEY in range(26):
plain = ""

for char in list(ENC):
ASCII = ord(char)
num = ASCII - 97
num = (num - KEY) % 26
ASCII = num + 97
plain += chr(ASCII)

print(plain)


出力結果

dssoh

crrng
bqqmf
apple
zookd
ynnjc
xmmib
wllha
vkkgz
ujjfy
tiiex
shhdw
rggcv
qffbu
peeat
oddzs
nccyr
mbbxq
laawp
kzzvo
jyyun
ixxtm
hwwsl
gvvrk
fuuqj
ettpi

出力結果より、平文はappleであると推測できる。


まとめ

シーザー暗号に対する、暗号化・復号・ブルートフォース攻撃を実装しました。

暗号アルゴリズムを実装してみることで、理解が深まると思います。

間違い・指摘等があればコメントお願いします。