以下に説明するように、CipherSaber暗号化プログラムを実装します。ガイドライン:
- バイト単位の最小のエントリが優先されます。
- ただし、コードゴルフの標準からの逸脱では、たとえ重要なゴルフエントリでなくても、興味深いエントリを投稿することを歓迎します。
- 通常、エントリは、標準入力からプレーンテキストを取得し、暗号テキストを標準出力に書き込み、ユーザーが指定した方法でキーを(ユーザーが)指定するプログラムです。
- ただし、これをプロシージャとして実装する場合は、それでも問題ありません。
- IVは、暗号で保護された擬似乱数ジェネレータから取得する必要があります。お使いの言語がそれをサポートしていない場合は、別の言語を選択してください。;-)
- 暗号固有のライブラリ、システムコール、または命令(上記で規定されているPRNG以外)は使用しないでください。もちろん、一般的な低レベルのビット単位操作は大丈夫です。
CipherSaberはRC4 / Arcfourの変形なので、後者について説明することから始め、CipherSaberがそれに対して行う変更について説明します。
0. RC4 / Arcfour
Arcfourは他の場所で完全に指定されていますが、完全を期すためにここで説明します。(インターネットドラフトとこの説明の間に矛盾がある場合、前者は規範的です。)
キー設定
2つの配列、S
およびをセットアップします。S2
両方とも長さ256です。ここk_1
で、はキーの最初のバイトでk_n
、最後はバイトです。
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
(S2
すべての256バイトがいっぱいになるまで、キーのバイトが何度も書き込まれます。)
次に、j
0 に初期化し、256回シャッフルします。
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
これでキーのセットアップが完了しました。S2
配列は、もはやここで使用されていない、とスクラブすることができます。
暗号ストリーム生成
0に初期化i
してj
から、次のようにキーストリームを生成します。
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
データの暗号化/復号化
- 暗号化するには、キーストリーム出力をプレーンテキストでXORします
- 復号化するには、キーストリーム出力と暗号文をXORします
1.サイファーセイバー
CipherSaber(この質問で実装しているもの)は、RC4 / Arcfourの2つの方法のバリエーションです。
10バイトIV /ノンス
メッセージを暗号化するときは、viaなど、ランダムな10バイトを取得し、/dev/urandom
暗号化された出力の最初の10バイトに書き込む必要があります。メッセージを復号化するとき、入力の最初の10バイトは、暗号化に使用されるIVです。
RC4 / Arcfourキーセットアップステージはpassphrase || IV
キーとして実行されます。ここpassphrase
で、ユーザー指定のパスフレーズIV
は上記のとおりで、||
連結されています。「Hello、world!」のパスフレーズ そして、「supercalif」のIV(ただし、それは:-Pではありませんが)は、「Hello、world!supercalif」のキーになります。
キー設定の複数の反復
WEP暗号化が完全に壊れた脆弱性を防ぐために、RC4のキーセットアップステージのシャッフルループがユーザー指定の回数実行されます。の値はj
反復間で保持する必要があります。
2.テストベクター
以下に、プログラムのテストに使用できるいくつかのテストベクトルを示します。さらに、squeamish ossifrageは、結果の検証に使用できるCipherSaber暗号化および復号化ツールを作成しました。
暗号化プログラムを実装するだけです。復号化プログラムを提供する必要はありませんが、正しいキーを使用して正しく実装された復号化プログラムで処理する場合、暗号化プログラムの出力は元の入力に正しく往復する必要があります。
urandom
「勝つ」ことを気にする場合は(必要に応じて別のエントリにすることもできます)を使用するバージョンを作成できます。:-)