Cipherサイファーモジュール

本ページには広告が含まれています。

Cipherモジュールは、暗号化・復号する関数をまとめたモジュールです。シーザー暗号・ROT13・ヴィジュネル暗号・XOR暗号の4種類が使えます。

構文
  1. UString = Cipher.Caesar.encode( str, num )
  2. UString = Cipher.Caesar.decode( str, num )
  3. UString = Cipher.ROT13.encode( str )
  4. UString = Cipher.ROT13.encode( str )
  5. UString = Cipher.Vigenere.encode( str, key )
  6. UString = Cipher.Vigenere.decode( str, key )
  7. UString = Cipher.XOR.encode( str, key )
  8. UString = Cipher.XOR.decode( str, key )
引数
str 必須
暗号化または復号する文字列
num 必須
シーザー暗号で文字をシフトさせる数
key 必須
戻り値
暗号化または復号した文字列

プログラム

UWSC

解説

    2-20行目
    UWSC
    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行目
    UWSC
    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行目
    UWSC
    Cipher.ROT13.encode
    ROT13でエンコードします。

    シーザー暗号で13文字シフトします。

    43-45行目
    UWSC
    Cipher.ROT13.decode
    ROT13でデコードします。
    暗号化を2回行うと元に戻るので、再度ROT13でエンコード。
    46-63行目
    UWSC
    Cipher.Vigenere.encode
    ヴィジュネル暗号でエンコードします。
    64-81行目
    UWSC
    Cipher.Vigenere.decode
    ヴィジュネル暗号でデコードします。
    82-91行目
    UWSC
    Cipher.XOR.encode
    XOR暗号でエンコードします。
    92-101行目
    UWSC
    Cipher.XOR.decode
    XOR暗号でデコードします。

プログラム実行例

シーザー暗号

UWSC
結果
CSV
使用関数

シーザー暗号

シーザー暗号は単一換字式暗号の一種で、平文の各文字を3字分シフトして作る暗号のことです。例えばADBEに置換します。文字のシフト数は固定だが、3である必要はありません。

シフト数が26の倍数の場合、平文と同じになります。

シフトする数がすべての文字で同じなので、アルファベットで構成された文は26通りすべて総当りすることで簡単に破られます。

\[E_{n}(x)=(x+n) \quad \rm{mod} \quad 26\] \[D_{n}(x)=(x-n) \quad \rm{mod} \quad 26\]

シーザー暗号の解析

シーザー暗号で暗号化されていることがわかっている場合、26パターンしかないので総当たりをすることで解読することができます。

以下のプログラムで全パターンを出力することができ、その結果の中から暗号化する前の文字列を見つけることができます。

UWSC

例えばWklv lv d shq.という文字列を解析したい場合は、以下のプログラムで全パターンを出力します。出力された結果の中から、出力された平文を順に調べていくと3番目のThis is a pen.が元の文だということがわかります。

UWSC
結果
復号シフト取得される平文
1Vjku ku c rgp.
2Uijt jt b qfo.
3This is a pen.
4Sghr hr z odm.
5Rfgq gq y ncl.
6Qefp fp x mbk.
7Pdeo eo w laj.
8Ocdn dn v kzi.
9Nbcm cm u jyh.
10Mabl bl t ixg.
11Lzak ak s hwf.
12Kyzj zj r gve.
13Jxyi yi q fud.
14Iwxh xh p etc.
15Hvwg wg o dsb.
16Guvf vf n cra.
17Ftue ue m bqz.
18Estd td l apy.
19Drsc sc k zox.
20Cqrb rb j ynw.
21Bpqa qa i xmv.
22Aopz pz h wlu.
23Znoy oy g vkt.
24Ymnx nx f ujs.
25Xlmw mw e tir.
26Wklv lv d shq.

ROT13

ROT13は単一換字式暗号(シーザー暗号)の一種で、平文の各文字を13字分シフトして作る暗号のことです。例えばANBOに置換します。ROTate by 13 placesの略。暗号化と復号が同じ処理でとても単純なのもこの暗号の特徴。アルファベットが26文字であるのに対し、暗号化は13文字シフトするので2回処理をすると元の文に戻ります。

\[{\rm{ROT}}_{13}({\rm{ROT}}_{13}(x))={\rm{ROT}}_{26}(x)=x\]
UWSC
結果
プレーンテキスト

ROT13の解析

ROT13はアルファベットを13文字シフトしただけなので、もう一度ROT13で暗号化(13文字後ろにシフト)するか復号(13文字前にシフト)することで解析することができます。

UWSC
結果
プレーンテキスト

ヴィジュネル暗号

アルファベットを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モジュール (自作関数)
モールス信号の符号化・復号を行います。