私は現在、ワンタイム パッドを実装するための非常に小さな Java プログラムを作成しています。ここでは、パッド (またはキー) 自体が SecureRandom オブジェクトを使用して一連のバイトとして生成され、SHA- 512 アルゴリズム。
ワンタイム パッドを生成しても問題は発生しませんでした。毎回同じシード文字列を指定すると、予想どおり、疑似乱数の同じシーケンスが得られ、復号化する人が持っている限り、復号化プロセスが可能になります。暗号化に使用されるシード文字列。
ファイルを暗号化しようとすると、プログラムは一度に 64 文字のデータを読み取り (通常は奇数であるファイルの終わりを除く)、64 バイト (または一致する量) の疑似乱数バイトを生成します。両方の配列の要素間で XOR が実行され、暗号文字を含む結果のchar配列がファイルに書き込まれ、ファイル内のすべてのテキストが読み取られるまでプロセスが繰り返されます。
ここで、Java はすべてのプリミティブを符号付きの数値 (データ型のバイト範囲は 0 から 255 ではなく、-128 から 127 の範囲) として扱うため、XOR 演算の結果が負の値 (-128 から -1) になる可能性があることを意味します (-128 から -1)。 . Java はこれらの値を有効な ASCII として認識せず、単純に ? を書き込むようです。(疑問符) をファイルに追加して、負の値を指定します。暗号文を復号化するためにファイルから読み取る場合、? ファイルに書き込まれる必要のある文字は失われ、疑問符の有効な ASCII コードである 63 に置き換えられます。
これは、この値を XOR しても意味がなく、元の値がなければ平文を生成する方法がないことを意味します。ちなみに、一部のデータを暗号化してから、その直後にデータを復号化する動作を、同じプログラムの実行中に再現し、途中でステータスを出力しても問題ありません。データがファイルに書き込まれた場合にのみ、情報が失われます。
また、各暗号化 XOR の結果に 128 を加算してから、復号化 XOR (各値を有効な ASCII 範囲に入れるため) を実行する前にそれを減算しようとしたことにも言及する必要がありますが、? 128 から 159 までの 31 個の ASCII コードが読み取れず、?
私はこれでしばらく頭をぶつけていましたが、助けていただければ幸いです。乾杯。