java - Bouncy CastLe Diffie-Hellman 与 KDF 的 key 协议(protocol) : What is user keying material?

标签 java cryptography bouncycastle diffie-hellman kdf

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 。 SHA3​​84KDF 可能是 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/

相关文章:

java - 在Java中使用对象数据流和原始数据流哪个更有效率?

hash - Erlang 密码模块 - ECDSA、RSA、SHA256 等

java - 如何在 PHP 中解密 Bouncy CaSTLe (AES/CBC) 数据?

java - 得到了 org.bouncycaSTLe.jcajce.provider.symmetry.util.BaseBlockCipher$1 : nonce must have length from 7 to 13 octets while decrypt bytes

java - 设置 JList 以填充其所添加到的组件的整个大小

java - 相同的值多次保存到数据库中,即使 hibernate 中存在另一个列表

java - 获取错误 java.lang.ArrayIndexOutOfBoundsException : too much data for RSA block

java - 需要支持 1 位反馈密码模式的 3-DES 密码库

php - 对角读取数组以进行转置密码?

java - Scala 项目不会使用 Bouncy CaSTLe 作为依赖项进行编译