Pythonでシーザー暗号を実装する方法についてソースコード付きでまとめました。
シーザ暗号の実装例
シーザー暗号(Caesar Cipher)とは、世界初の暗号化手法で有名なシーザー(カエサル)が用いたものだそうです。
その方法は極めて単純な方法で、決められた数だけ文字をずらします。
例えば、「SAO」を1文字ずつずらせば「TBP」となります。
復号化(暗号した文章を元に戻す)は、逆向きに1文字ずつずらします。(元のSAOになります)
(シーザー暗号では、ずらす文字数が鍵(パスワード)となります)
今回は、これをPython3のchr・ord関数で実装してみます。
– | 関連ページ |
---|---|
原理 | 【シーザー暗号】原理・アルゴリズム・例題 |
参考 | ■【Python】chr・ord関数で「文字」「アスキーコード(ascii)」の相互変換 ■【ASCII】アスキーコードの一覧表 |
サンプルコード
サンプルプログラムのソースコードです。
# シーザー暗号で暗号化
def encrypt(plaintext, key):
ciphertext = ""
for ch in list(plaintext):
if 'A' <= ch <= 'Z':
ciphertext += chr((ord(ch) - ord('A') - int(key)) % 26 + ord('A'))
elif 'a' <= ch <= 'z':
ciphertext += chr((ord(ch) - ord('a') - int(key)) % 26 + ord('a'))
else:
ciphertext += ch
return ciphertext
# シーザー暗号で復号化
def decrypt(ciphertext, key):
plaintext = ""
for ch in list(ciphertext):
if 'A' <= ch <= 'Z':
plaintext += chr((ord(ch) - ord('A') + int(key)) % 26 + ord('A'))
elif 'a' <= ch <= 'z':
plaintext += chr((ord(ch) - ord('a') + int(key)) % 26 + ord('a'))
else:
plaintext += ch
return plaintext
# 平文
plaintext = "Excalibur"
# 鍵
key = "1"
# 平文の表示
print("平文 : " + plaintext) # 平文 : Excalibur
# 暗号化
ciphertext = encrypt(plaintext, key)
print("暗号文 : " + ciphertext) # 暗号文 : Dwbzkhatq
# 暗号文を復号化
ciphertext = decrypt(ciphertext, key)
print("復号文 : " + ciphertext) # 復号文 : Excalibur
上記の例だとキーが「1」なので平文を1文字ずらしたものが暗号文となります。
(キーが「a」ならアスキーコードは97なので、97字分ずらす)
- | 関連記事 |
---|---|
1 | ■【Python】データの暗号化・サンプル例 |
2 | ■Python入門 基本文法 |
コメント