まず、話されている「文字列」は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バイトをゼロに設定するだけです。
最後のブロックを処理し、次に特定の出力サイズに必要なだけ左から多くのバイトを使用する必要があることを除いて、それだけです。
Bouncy CastleとJavaソースコードの両方をすぐに利用できることに注意してください。時には読むのが簡単ではないので、私は素敵で、代わりにそれを説明しました。 –