最も原初的な暗号の一つに,シーザー暗号というものがあります。
簡単に説明すると,
ABC →暗号化→ EFG
あいう →暗号化→ くけこ
というように,文字を一定数分ずらすというものです。
超簡単なアルゴリズムで,ずらす量が分かれば簡単に解くことができます。
ctfの書籍や常設ctfの最初の方に出てくることで有名でもあります(たぶん)
ずらす量と言っても,ローマ字の場合,全部で26文字なので,最悪25通り(元の文章があるので26-1通り)試せば復号できるのですが……
元の文 | ずらす量 | 結果 |
abCD | 3 | deFG |
xyz | 2 | zab |
暗号あんごう | 1 | 暗号いあごえ |
表の最後の奴は,たぶんこんな感じだと思います。漢字や濁点付きの文字を取り扱うならば,まず復号する人に文字の順番が記録された辞書を渡す必要があるのですが,そんなもの貰ってません。次の文字が分からなければ,そもそも暗号化できません。(貰ってたら別よ)
Z(ん)以降は,またabc(あいう)のように変化していきます。
例:『ABYZ』を暗号化するときに,3文字ずらすとなったら,『DEBC』となります。
さっそく,python3のコード。ローマ字の小文字,大文字に対応しています。
(python2だと,上手く動かないです)
この章では,このプログラムの使い方だけを説明し,次の章で中身などを紹介します。
実行すると,
caesar cipher program
[mode] encryption:1 decryption:2>>
と聞かれるので,暗号化なら1を,復号なら2を入力してください。
次に,
your sentence:
と表示されるので,暗号化/復号したい文字列を入力。
暗号化(encryption)だと,さらにずらす大きさ(1~25)を入力すると,ずらした文字列が出力されます。
復号(dencryption)だと,1~25ずらしたすべての結果を出力します。
ローマ字小文字のシーザー暗号についての処理は,こんな感じ。
文字の順番は,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
( *´艸`)<<こんな感じ。