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 共享吗?
在DHKDFParameters
class中用作extraInfo
参数,用于初始化KDF。 KDF 可用于从主密钥导出不同的密钥,方法是混合除共享秘密之外的其他字节,从密钥协商算法计算,在本例中为 ECCDH。 SHA384KDF 可能是一个 ANS X9.63 兼容的 KDF,它需要一个额外的 Info
八位字节串(这个八位字节串有各种 "info" 启发的名称(即字节数组)。
没有关于如何生成它的规范。它可以是标签的 ASCII 编码,比如 "SessionKeyMaterial".getBytes(StandardCharsets.US_ASCII)
。它还可以包括双方的标识符、public 密钥、随机数。本质上它可以接受任何数据,只要您设法对该数据进行不重叠的显式编码(即数据的规范表示)。
通常它只是一个称为标签的静态字符串。没有长度限制,数据可以共享 publicly。共享秘密将确保生成的密钥仅在正确的各方之间共享,只要连接以某种方式 已验证 ;毕竟,您需要知道您正在与谁执行密钥协议。
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 共享吗?
在DHKDFParameters
class中用作extraInfo
参数,用于初始化KDF。 KDF 可用于从主密钥导出不同的密钥,方法是混合除共享秘密之外的其他字节,从密钥协商算法计算,在本例中为 ECCDH。 SHA384KDF 可能是一个 ANS X9.63 兼容的 KDF,它需要一个额外的 Info
八位字节串(这个八位字节串有各种 "info" 启发的名称(即字节数组)。
没有关于如何生成它的规范。它可以是标签的 ASCII 编码,比如 "SessionKeyMaterial".getBytes(StandardCharsets.US_ASCII)
。它还可以包括双方的标识符、public 密钥、随机数。本质上它可以接受任何数据,只要您设法对该数据进行不重叠的显式编码(即数据的规范表示)。
通常它只是一个称为标签的静态字符串。没有长度限制,数据可以共享 publicly。共享秘密将确保生成的密钥仅在正确的各方之间共享,只要连接以某种方式 已验证 ;毕竟,您需要知道您正在与谁执行密钥协议。