Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用KDF和SHA-256在ECDHC之后生成对称密钥_Java_Cryptography_Bouncycastle - Fatal编程技术网

Java 使用KDF和SHA-256在ECDHC之后生成对称密钥

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

我想使用基于SHA-256的单步密钥派生函数(KDF)生成对称密钥。 我认为自1.50版以来,BouncyCastle的轻量级API中就有关键的派生版本

我已经成功地生成了密钥“Z”,并且有一个从Z生成KDF的代码

请输入下面的代码

    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)