Java 使用KDF和SHA-256在ECDHC之后生成对称密钥
我想使用基于SHA-256的单步密钥派生函数(KDF)生成对称密钥。 我认为自1.50版以来,BouncyCastle的轻量级API中就有关键的派生版本 我已经成功地生成了密钥“Z”,并且有一个从Z生成KDF的代码 请输入下面的代码Java 使用KDF和SHA-256在ECDHC之后生成对称密钥,java,cryptography,bouncycastle,Java,Cryptography,Bouncycastle,我想使用基于SHA-256的单步密钥派生函数(KDF)生成对称密钥。 我认为自1.50版以来,BouncyCastle的轻量级API中就有关键的派生版本 我已经成功地生成了密钥“Z”,并且有一个从Z生成KDF的代码 请输入下面的代码 byte[] data = new byte[16]; SecretKey secretKeyA = generateSharedSecretZ(keyPairA.getPrivate(), keyPairB.getPubli
byte[] data = new byte[16];
SecretKey secretKeyA = generateSharedSecretZ(keyPairA.getPrivate(),
keyPairB.getPublic());
System.out.println(bytesToHex(secretKeyA.getEncoded()));
//Single-Step KDF specification using SHA256
Digest digest = new SHA256Digest();
System.out.println(digest.getDigestSize());
HKDFBytesGenerator kDF1BytesGenerator = new HKDFBytesGenerator(digest);
kDF1BytesGenerator.init(new HKDFParameters(secretKeyA.getEncoded(),
generateSalt(), null));
kDF1BytesGenerator.generateBytes(data, 0, 16);
System.out.println(new String(data));
System.out.println(data.length);
使用以下方法生成盐
private static byte[] generateSalt() throws NoSuchAlgorithmException {
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[32];
random.nextBytes(salt);
return salt;
}
我正在使用org.bouncycastle.crypto.generators.HKDFBytesGenerator使用sha-256生成对称密钥。上述实现是单步KDF吗?根据NIST 800-56A文件,我是否遗漏了使用sha-256单步KDF生成对称密钥的任何相关步骤
对称密钥是否有任何标准大小。Iam使用对称密钥根据GCM-GMAC规范生成MAC。注意,如果在HKDF中使用salt值,则需要传达salt值。对于密钥协议后的KDF,它应该已经提供了足够的秘密信息,我认为它是严格可选的。 是的,它是一个单步KDF(至少它不会像基于密码的密钥派生函数那样使用多次迭代)
不,你似乎没有错过任何步骤(没有那么多)。你可以考虑使用<代码>“GCM.gMAC”。GETBEYS(Stand DaveStudio.UsAsCII)< /C>作为信息的值;这使得稍后生成更多的键更容易。
对称密钥没有标准大小。现代密码至少需要128位(16字节)AES使用128, 192或256位密钥,两者都不是一个坏的选择。AES-128可能稍微快一些,不需要java的无限加密文件。AES-256可以防止使用量子密码分析的一些未来攻击。rypto.stackexchange.com而不是这样。那里有更多的密码学家,他们有更好的知识,这应该意味着更好的答案(我的答案将在那里得到更多的审查:P)