シーザー暗号とは
最も原初的な暗号の一つに,シーザー暗号というものがあります。
簡単に説明すると,
ABC →暗号化→ EFG
あいう →暗号化→ くけこ
というように,文字を一定数分ずらすというものです。
超簡単なアルゴリズムで,ずらす量が分かれば簡単に解くことができます。
ctfの書籍や常設ctfの最初の方に出てくることで有名でもあります(たぶん)
ずらす量と言っても,ローマ字の場合,全部で26文字なので,最悪25通り(元の文章があるので26-1通り)試せば復号できるのですが……
元の文 | ずらす量 | 結果 |
abCD | 3 | deFG |
xyz | 2 | zab |
暗号あんごう | 1 | 暗号いあごえ |
表の最後の奴は,たぶんこんな感じだと思います。漢字や濁点付きの文字を取り扱うならば,まず復号する人に文字の順番が記録された辞書を渡す必要があるのですが,そんなもの貰ってません。次の文字が分からなければ,そもそも暗号化できません。(貰ってたら別よ)
ローマ字を暗号化するときはローマ字のみ,ひらがなの時はひらがなのみの暗号のみに。
Z(ん)以降は,またabc(あいう)のように変化していきます。
例:『ABYZ』を暗号化するときに,3文字ずらすとなったら,『DEBC』となります。
Z(ん)以降は,またabc(あいう)のように変化していきます。
例:『ABYZ』を暗号化するときに,3文字ずらすとなったら,『DEBC』となります。
Python で暗号化,復号してみる
さっそく,python3のコード。ローマ字の小文字,大文字に対応しています。
(python2だと,上手く動かないです)
この章では,このプログラムの使い方だけを説明し,次の章で中身などを紹介します。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
def encryption(sentence,key): | |
for char in sentence: | |
if char>='a' and char<='z': | |
ret=chr((ord(char)+int(key)-ord('a'))%26 + ord('a')) | |
elif char>='A' and char<='Z': | |
ret=chr((ord(char)+int(key)-ord('A'))%26 + ord('A')) | |
else: | |
ret=char | |
sys.stdout.write(ret) | |
print() | |
print('caesar cipher program') | |
sys.stdout.write('[mode] encryption:1 decryption:2>>') | |
mode=int(input()) | |
while mode!=1 and mode!=2: | |
print('wrongnumber\n') | |
mode=input() | |
print('your sentence:') | |
s=input() | |
if mode==1: | |
#encryption | |
sys.stdout.write('[encryption mode] value >>') | |
k=input() | |
encryption(s,k) | |
elif mode==2: | |
#decryption | |
for x in range(27): | |
sys.stdout.write(str(x)+':') | |
encryption(s,x) |
実行すると,
caesar cipher program
[mode] encryption:1 decryption:2>>
と聞かれるので,暗号化なら1を,復号なら2を入力してください。
次に,
your sentence:
と表示されるので,暗号化/復号したい文字列を入力。
暗号化(encryption)だと,さらにずらす大きさ(1~25)を入力すると,ずらした文字列が出力されます。
復号(dencryption)だと,1~25ずらしたすべての結果を出力します。
実際,シーザー暗号の復号も暗号化も処理は同じだから,ずらす量を指定して復号したいなら,encryptionで数値入力して動かしてください
このプログラムの処理について
ローマ字小文字のシーザー暗号についての処理は,こんな感じ。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ret=chr((ord(char)+int(key)-ord('a'))%26 + ord('a')) | |
#ret:ずらされた文字 | |
#char:ずらす文字 | |
#key:ずらす量 |
文字の順番は,a,b,c……x,y,z,a,b,cと続いていきます。
処理としては,暗号化したい文字の文字コードにずらす数値をプラスします。
なので,aを0として考えて,そこから,どれくらいずれているかを計算し,aの文字コードの大きさを足して,文字に戻しているって感じです。
例:cから4文字ずらす。
ord('c')-ord('a') =3
3+int(3) =6
6%26 =6
chr(6+ord('a')) =g
( *´艸`)<<こんな感じ。