Cipherモジュールは、暗号化・復号する関数をまとめたモジュールです。シーザー暗号・ROT13・ヴィジュネル暗号・XOR暗号の4種類が使えます。
- 構文
- UString = Cipher.Caesar.encode( str, num )
- UString = Cipher.Caesar.decode( str, num )
- UString = Cipher.ROT13.encode( str )
- UString = Cipher.ROT13.encode( str )
- UString = Cipher.Vigenere.encode( str, key )
- UString = Cipher.Vigenere.decode( str, key )
- UString = Cipher.XOR.encode( str, key )
- UString = Cipher.XOR.decode( str, key )
- 引数
- str 必須
- 暗号化または復号する文字列
- num 必須
- シーザー暗号で文字をシフトさせる数
- key 必須
- 鍵
- 戻り値
- 暗号化または復号した文字列
プログラム
解説
- 2-20行目
- Cipher.Caesar.encode
- シーザー暗号でエンコードします。シフトする文字数のデフォルトは3文字です。
エンコードした結果を代入する変数resを宣言。変数normalizedNumberにシフトさせる数を0~25の範囲に正規化した数値を代入。
- ASC(s) >= ASC("A") AND ASC(s) <= ASC("Z")(変数sの文字が大文字ならば)
- ASC(s) >= ASC("a") AND ASC(s) <= ASC("z")(変数sの文字が小文字ならば)
- アルファベット以外の文字
- そのまま代入
- 21-39行目
- Cipher.Caesar.decode
- シーザー暗号でデコードします。
変数sにデコードする文字列から1文字を代入。
変数normalizedNumberにシフトさせる数を0~25の範囲に正規化した数値を代入。
- ASC(s) >= ASC("A") AND ASC(s) <= ASC("Z")
- マイナスにならないように「+26」する。
AのASCIIコードにシフトする数を加算してから文字に戻す。
- ASC(s) >= ASC("a") AND ASC(s) <= ASC("z")
- マイナスにならないように「+26」する。
AのASCIIコードにシフトする数を加算してから文字に戻す。
- アルファベット以外の文字
- そのまま代入
- 40-42行目
- Cipher.ROT13.encode
- ROT13でエンコードします。
シーザー暗号で13文字シフトします。
- 43-45行目
- Cipher.ROT13.decode
- ROT13でデコードします。
- 46-63行目
- Cipher.Vigenere.encode
- ヴィジュネル暗号でエンコードします。
- 64-81行目
- Cipher.Vigenere.decode
- ヴィジュネル暗号でデコードします。
- 82-91行目
- Cipher.XOR.encode
- XOR暗号でエンコードします。
- 92-101行目
- Cipher.XOR.decode
- XOR暗号でデコードします。
プログラム実行例
シーザー暗号
シーザー暗号
シーザー暗号は単一換字式暗号の一種で、平文の各文字を3字分シフトして作る暗号のことです。例えばAをD、BをEに置換します。文字のシフト数は固定だが、3である必要はありません。
シフト数が26の倍数の場合、平文と同じになります。
シフトする数がすべての文字で同じなので、アルファベットで構成された文は26通りすべて総当りすることで簡単に破られます。
\[E_{n}(x)=(x+n) \quad \rm{mod} \quad 26\] \[D_{n}(x)=(x-n) \quad \rm{mod} \quad 26\]シーザー暗号の解析
シーザー暗号で暗号化されていることがわかっている場合、26パターンしかないので総当たりをすることで解読することができます。
以下のプログラムで全パターンを出力することができ、その結果の中から暗号化する前の文字列を見つけることができます。
例えばWklv lv d shq.という文字列を解析したい場合は、以下のプログラムで全パターンを出力します。出力された結果の中から、出力された平文を順に調べていくと3番目のThis is a pen.が元の文だということがわかります。
- 結果
復号シフト 取得される平文 1 Vjku ku c rgp. 2 Uijt jt b qfo. 3 This is a pen. 4 Sghr hr z odm. 5 Rfgq gq y ncl. 6 Qefp fp x mbk. 7 Pdeo eo w laj. 8 Ocdn dn v kzi. 9 Nbcm cm u jyh. 10 Mabl bl t ixg. 11 Lzak ak s hwf. 12 Kyzj zj r gve. 13 Jxyi yi q fud. 14 Iwxh xh p etc. 15 Hvwg wg o dsb. 16 Guvf vf n cra. 17 Ftue ue m bqz. 18 Estd td l apy. 19 Drsc sc k zox. 20 Cqrb rb j ynw. 21 Bpqa qa i xmv. 22 Aopz pz h wlu. 23 Znoy oy g vkt. 24 Ymnx nx f ujs. 25 Xlmw mw e tir. 26 Wklv lv d shq.
ROT13
ROT13は単一換字式暗号(シーザー暗号)の一種で、平文の各文字を13字分シフトして作る暗号のことです。例えばAをN、BをOに置換します。ROTate by 13 placesの略。暗号化と復号が同じ処理でとても単純なのもこの暗号の特徴。アルファベットが26文字であるのに対し、暗号化は13文字シフトするので2回処理をすると元の文に戻ります。
\[{\rm{ROT}}_{13}({\rm{ROT}}_{13}(x))={\rm{ROT}}_{26}(x)=x\]- 結果
ROT13の解析
ROT13はアルファベットを13文字シフトしただけなので、もう一度ROT13で暗号化(13文字後ろにシフト)するか復号(13文字前にシフト)することで解析することができます。
- 結果
ヴィジュネル暗号
アルファベットを0~25(a~z)の数値としてみれば、次の式が成り立ちます。ただし、\(P_{i}\)は平文の\(i\)文字目、\(K_{i}\)は鍵の\(i\)文字目、\(C_{i}\)は暗号文の\(i\)文字目です。
以下が、ヴィジュネル暗号は多表式の換字式暗号です。
\[C_{i}=(P_{i}+K_{i}) \quad \rm{mod} \quad 26\] \[P_{i}=(C_{i}-K_{i}) \quad \rm{mod} \quad 26\]
XOR暗号
XOR暗号とは、平文をバイナリデータと考えて、2進数の鍵とXORをとって暗号化する手法のことです。
XOR(排他的論理和)には、以下の特徴があります。
- 与えられた2つの入力のうち片方が真・片方が偽のとき真を出力し、両方とも真もしくは偽のときは偽を出力する。
- ビットごとの排他的論理和は特定ビットの反転操作なので、2回繰り返せばもとに戻る。
公開日:
更新日:
関連記事
- MODULE化
- 複数の変数や類似する機能を持つ関数をひとつのグループとしてまとめます。
- QuotedPrintableモジュール (自作関数)
- Quoted-printableのエンコード・デコードを行います。
- Base64モジュール (自作関数)
- Base64のエンコード・デコードを行います。
- Morseモジュール (自作関数)
- モールス信号の符号化・復号を行います。
