Bouncy CaSTLe Diffie-Hellman 文档谈到在从静态长期 key 对派生临时 key 时使用“用户 key Material ”和 KDF。没有提及如何生成这个 key Material 。
例如,在 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有哪些规范?它可以是像他们的示例一样的单个静态字符串还是本质上是一个随机数?什么长度?当各方交换公钥时可以公开共享吗?
最佳答案
它用作DHKDFParameters
类中的extraInfo
参数,用于初始化KDF。 KDF 可用于通过混合除共享 secret 之外的附加字节(根据 key 协商算法(在本例中为 ECCDH)计算)来从主 key 导出不同的 key 。 SHA384KDF 可能是 ANS X9.63 兼容的 KDF,它需要一个额外的 Info
八位字节字符串(此八位字节字符串有各种受“info”启发的名称(即字节数组)。
没有关于如何生成它的规范。它可以是标签的 ASCII 编码,例如 "SessionKeyMaterial".getBytes(StandardCharsets.US_ASCII)
。它还可以包括双方的标识符、公钥、随机数。本质上,它可以接受任何数据,只要您设法对不重叠的数据进行显式编码(即数据的规范表示)。
通常它只是一个称为标签的静态字符串。没有长度限制,数据可以公开共享。共享 secret 将确保生成的 key 仅在正确的各方之间共享,只要连接以某种方式进行了身份验证;毕竟,您需要知道您正在与谁执行 key 协议(protocol)。
关于java - Bouncy CastLe Diffie-Hellman 与 KDF 的 key 协议(protocol) : What is user keying material?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54875554/