シーザー暗号 (Caesar cipher) は平文(ひらぶん)の各文字を3文字分ずらして暗号文を作成するという非常にシンプルな暗号です.例えば,アルファベットの「...OPQRSTUVW...」という並びを考えたとき,「U」という文字を3文字分左にずらして「R」に置き換えて暗号文を作成します.
Python で文字をずらす処理は,(1) 文字コードを取得し,(2) その文字コードから3を引く,(3) 引き算で得られた文字コードを文字に変換する,という手順で行えます.したがって,「U」という文字を「R」に変換する処理は次のように記述すれば良いことになります.
s = 'U'
chr(ord(s) - 3)
'R'
なお,文字コードを取得する ord()
関数の説明はここを,文字コードから文字に変換する chr()
関数の説明はここを参照してください.
この手順を使って「UNIVERSITY」という平文 (plaintext) を暗号化して暗号文 (ciphertext) を作成してみましょう.
plaintext = 'UNIVERSITY' # 平文を設定
ciphertext = '' # 暗号文を初期化
for s in plaintext:
# 3文字左にずらして暗号文に追加する
ciphertext += chr(ord(s) - 3)
print(ciphertext)
RKFSBOPFQV
この結果「RKFSBOPFQV」という暗号文が得られました.
次は,上で得られたシーザー暗号の「RKFSBOPFQV」という暗号文を復号してみましょう.暗号化では左に3文字ずらしたので,復号では右に3文字ずらすだけです.つまり,上のコードの5行目にある - 3
を + 3
に変更するだけです.なお,以下のプログラムは変数の名前も置き換えています.
ciphertext = 'RKFSBOPFQV' # 暗号文を設定
plaintext = '' # 平文を初期化
for s in ciphertext:
# 3文字右にずらして平文に追加する
plaintext += chr(ord(s) + 3)
print(plaintext)
UNIVERSITY
この結果「UNIVERSITY」という平文を得ることができました.
シーザー暗号は非常に単純なアルゴリズムであるため,現代ではシーザー暗号がそのまま用いられることはありません.しかしながら,シーザー暗号を通して暗号化や復号のイメージを掴むことは重要かもしれません.