バックグラウンド
ワンタイムパッドが適切に使用されている場合、クラックすることは不可能であることが証明されている暗号化の形式です。
暗号化は、プレーンテキスト(A〜Zの文字のみで構成される)を取得し、同じ長さの(ランダムな文字のみの)ランダム文字列を生成することにより実行されます。この文字列はキーとして機能します。次に、平文の各文字は、キーの対応する文字とペアになります。暗号文は次のように計算されます。各ペアについて、両方の文字が数字に変換されます(A = 0、B = 1、... Z = 25)。2つの数値はモジュロ26で加算されます。この数値は文字に変換されます。
解読は正反対です。暗号文とキーの文字はペアになり、数字に変換されます。次に、キーは26を法とする暗号文から減算され、結果は文字AZに変換されます。
チャレンジ
あなたの課題は、ワンタイムパッドの暗号化と復号化の両方が可能な最短のプログラムを作成することです。
(STDINへの)入力の最初の行には、単語「ENCRYPT」または単語「DECRYPT」があります。
単語が暗号化されている場合、次の行はプレーンテキストになります。プログラムは、2行を(STDOUTに)出力する必要があります。1行目はキー、2行目は暗号文です。
単語が復号化されると、プログラムはさらに2行の入力を取得します。最初の行がキーになり、2番目の行が暗号文になります。プログラムは、復号化された平文である1行を出力する必要があります。
平文、暗号文、およびキーは常に大文字のA〜Zで構成する必要があります。それらは常に単一行であり、空白は含まれません。
キーは常にランダムでなければなりません。実行間でその大部分を繰り返すことはできません。また、テキストにパターンを見つけることはできません。
2つの簡単な例:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
>
あなたが出力としてそのシンボルを印刷する必要はありませんので、出力される行を表します。
/dev/random
、haveged
)が与えられ、バイトで順序をxorすることで暗号化し、キーで順序をxorすることで復号します。gist.github.com/5078264キーまたはランダム性はstdinから読み取ることができ、メッセージまたは暗号文はファイル名引数にすることができます。
/dev/hwrng
擬似ランダムを使用する代わりに(技術的には破損します)。)