2017-11-11 22 views
1

https://en.wikipedia.org/wiki/SHA-2に記載されているように、SHA-2の暗号機能に従っています。SHA 2ハッシングとJavaに関する問題

Iは言う線検査午前:

  • が長さLビットの元のメッセージで始まる単一の「1」ビットを付加します。
  • を追加します.Kは、L + 1 + K + 64が512の倍数になるような最小数> = 0です。
  • 64ビットのビッグエンディアンの整数としてLを追加します。総処理後の長さは512ビットの倍数です。

最後の2行はわかりません。文字列が短い場合、K '0'ビットを追加した後の長さは512になります。これをJavaコードでどのように実装すればよいですか?

答えて

1

まず、話されている「文字列」はJava Stringではなくビット列であることを明確にする必要があります。これらのアルゴリズムはバイナリ/ビットベースです。実装は、一般的にビットではなくバイトを処理しません。したがって、ビットの代わりにバイトが表示される翻訳フェーズがあります。

SHA-512は、512ビット(SHA-224/256)または1024ビット(SHA-384/512)のブロック単位で動作します。したがって、基本的には、64バイトまたは128バイトのバッファを用意してから操作してください。また、32ビットのintフィールド(SHA-224/256)または64ビットのlongフィールドにデータを直接キャッシュすることもできます。

ここで、パディングは比較的簡単な手順です。パディングはビットパディングと呼ばれます。ビッグエンディアンモード(SHA-2はSHA-3のbraindeadリトルエンディアンモードの代わりにこれを幸い使用します)で使用されているので、パディングはバイトの最上位ビットに1つのビットが設定され、残りはゼロ。これは、バッファに入れなければならない(byte) 0x80という値になります。

バッファがいっぱいであるためにこのパディングを作成できない場合は、前のブロックを処理してから、現在使用可能なバッファの最初のビットを(byte) 0x80に設定する必要があります。新しいJavaでは、より明示的な方法で(byte) 0b1_0000000バイトを使用することもできます。

これで、使用したハッシュ出力サイズに応じて、8〜16バイトが残るまでゼロを追加するだけです。十分なバイト数がない場合は、最後まで充填し、ブロックを処理し、8バイトまたは16バイトが再び残るまで0バイトで充填を再開します。

最後に、残った8バイトまたは16バイトにビットのビット番号をエンコードする必要があります。したがって、入力を8倍にして、可能な限り最下位ビットをJavaで期待するのと同じ方法でこれらのバイトをエンコードするようにしてください。あなた自身でプログラムしたくない場合は、https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#putLong-long-を使用してください。とにかく2^56バイト以上のものは忘れるかもしれないので、SHA-384/SHA-512をお持ちの場合は最初の8バイトをゼロに設定するだけです。

最後のブロックを処理し、次に特定の出力サイズに必要なだけ左から多くのバイトを使用する必要があることを除いて、それだけです。

+0

Bouncy CastleとJavaソースコードの両方をすぐに利用できることに注意してください。時には読むのが簡単ではないので、私は素敵で、代わりにそれを説明しました。 –

関連する問題