2

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 的规范是什么?它可以像他们的示例一样是单个静态字符串,还是本质上是随机数?多长?双方交换公钥时是否可以公开共享?

4

1 回答 1

1

它用作类中extraInfo的参数,DHKDFParameters用于初始化KDF。KDF 可用于从主密钥中导出不同的密钥,方法是混合除共享密钥之外的其他字节,根据密钥协商算法(在本例中为 ECDH)计算得出。SHA3​​84KDF 可能是与 ANS X9.63 兼容的 KDF,它需要一个额外的Info八位字节字符串(这个八位字节字符串(即字节数组)有各种“信息”启发的名称。

没有关于如何生成它的规范。它可能是标签的 ASCII 编码,比如"SessionKeyMaterial".getBytes(StandardCharsets.US_ASCII). 它还可以包括双方的标识符、公钥、随机数。本质上,它可以采用任何数据,只要您设法对该数据进行不重叠的显式编码(即数据的规范表示)。

通常它只是一个称为标签的静态字符串。没有长度限制,数据可以公开共享。共享密钥将确保生成的密钥仅在正确的各方之间共享,只要连接以一种或另一种方式进行身份验证;毕竟,您需要知道与谁执行关键协议。

于 2019-02-27T00:14:59.373 回答