SHA-3は既知の関数 (NIST ハッシュ関数コンペティションのファイナリストとしての Keccak) であるように思われるため、このトピックに関連するいくつかの質問があります。
- NIST のサイトによると、NIST は政府の資金提供の失効により閉鎖されています。SHA-3 が最終的に受け入れられる可能性はありますか?
- BouncyCastleライブラリには SHA-3 の実装があり、ダイジェスト結果はウィキペディアの記事に投稿された例と同じです(私はこれをテストしました)。最終的な規格が承認されていないので、これは信頼できますか? ウィキペディアは、これは変更される可能性が高いと述べていますが、最終的なアルゴリズムは変更の対象ではないように思われるため、どのように変更できますか (または、別のアルゴリズムになる可能性があります)。
- ここで誰かが、キーの強化とパスワードのハッシュのために SHA-3 で PBKDF2 を使用することは避けるべきであると指摘しました。しかし、私はなぜ理解できないのですか?(アルゴリズムが高速でない場合、攻撃者にどのように有利になるでしょうか?)
- BouncyCastle Java api に基づく scala での PBKDF2 -HMAC-SHA3の実装をテストするためのテスト ベクトルがどこにも見つかりませんでした。テスト仕様をいくつかの結果とともに投稿できます。しかし、最初に誰でも/仕様のテスト ベクトルを投稿できますか?
これがscalaでの私の実装です:
package my.crypto
import org.bouncycastle.crypto.digests.SHA3Digest
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator
import org.bouncycastle.crypto.PBEParametersGenerator
import org.bouncycastle.crypto.params.KeyParameter
object PBKDF2WithHmacSHA3 {
def apply(password: String, salt: Array[Byte], iterations: Int = 65536, keyLen: Int = 256): Array[Byte] = {
val generator = new PKCS5S2ParametersGenerator(new SHA3Digest(256))
generator.init(
PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(password.toCharArray),
salt,
iterations
)
val key = generator.generateDerivedMacParameters(keyLen).asInstanceOf[KeyParameter]
key.getKey
}
}
私にとって疑わしいことの1つはnew SHA3Digest(256)
、コンストラクターの256ビット長です。提供されたキーの長さと同じにする必要がありますか、それとも私が行ったように固定されたものにする必要がありますか? 一部の固定値しか使用できず、オブジェクト API ユーザーがキー長パラメーターとして任意の値を指定できるため、固定長を使用することにしましたが、一般的でないもののほとんどはSHA3Digest
コンストラクター内から例外がスローされます。また、デフォルト値は 288 (キーの長さが指定されていない場合) のようで、奇妙に見えます。
前もって感謝します!