Bouncy Castle Diffie-Hellman KeyAgreement 与 KDF:什么是用户键控 material?

Bouncy Castle Diffie-Hellman KeyAgreement with KDF: What is user keying material?

Bouncy Castle Diffie-Hellman 文档提到在从静态长期密钥对派生临时密钥时使用 "user keying material" 和 KDF。没有提到如何生成这个密钥 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 的生成规范是什么?它可以像他们的示例一样是单个静态字符串,还是本质上是随机数?多长?当双方交换 public 密钥时,它可以 public 共享吗?

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

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

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