Bouncy Castle Diffie-Hellman 文档谈到在从静态长期密钥对派生临时密钥时使用“用户密钥材料”和 KDF。没有提及如何生成此密钥材料。
例如,在 BCFipsIn100.pdf 中,他们有这个例子:
public static byte[] initiatorAgreementWithKdf(PrivateKey initiatorPrivate, PublicKey recipientPublic, byte[] userKeyingMaterial) throws GeneralSecurityException {
KeyAgreement agreement = KeyAgreement.getInstance("ECCDHwithSHA384CKDF", "BCFIPS");
agreement.init(initiatorPrivate, new UserKeyingMaterialSpec(userKeyingMaterial));
agreement.doPhase(recipientPublic, true);
SecretKey agreedKey = agreement.generateSecret("AES[256]");
return agreedKey.getEncoded();
}
他们的示例对 userKeyingMaterial 使用静态字符串,但一般没有提及这应该是什么。
关于如何生成 userKeyingMaterial 的规范是什么?它可以像他们的示例一样是单个静态字符串,还是本质上是随机数?多长?双方交换公钥时是否可以公开共享?