Bouncy Castle Diffie-Hellman与KDF的协议:什么是用户密钥资料?

时间:2019-02-25 22:17:24

标签: java cryptography bouncycastle diffie-hellman kdf

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的规范是什么?可以像示例一样是单个静态字符串,还是本质上是随机数?什么长度当各方交换其公共密钥时,可以公开共享吗?

1 个答案:

答案 0 :(得分:1)

它用作extraInfo类中的DHKDFParameters参数,用于初始化KDF。通过从密钥协商算法(在这种情况下为ECCDH)计算出的共享秘密之外,通过混合其他字节,可以使用KDF从主密钥中导出不同的密钥。 SHA3​​84KDF可能是与ANS X9.63兼容的KDF,它需要一个附加的Info八位字节字符串(此八位字节字符串(即字节数组)有各种受“信息”启发的名称。

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

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