在Java中实现Diffie-Hellman密钥交换
我正在尝试在Java中实现Diffie-Hellman密钥交换,但我很难理解规范:
根据JWA(RFC 7518)在直接密钥协议模式下,使用曲线P-256,dT和QC完成Diffie-Hellman密钥交换过程作为本地机制,以生成一对由事务ID标识的CEK(每个方向一个)。此版本的规范中支持的参数值为:
- “alg”: ECDH-ES
- “apv”: SDK 参考编号
- “epk”: QC,JSON Web Key (JWK) 格式
- {“kty”:“EC” “crv”:“P-256”}
- 所有其他参数:不存在
- CEK: “kty”:oct - 256 位
创建包含以下数据的 JSON 对象作为要签名的 JWS 有效负载:
{“MyPublicKey”: “QT”, “SDKPublicKey”:“ QC”}
使用 JWS 紧凑型序列化根据 JWS (RFC 7515) 生成完整 JSON 对象的数字签名。此版本的规范中支持的参数值为:
- “alg”: PS256 或 ES256
- “x5c”:X.5C v3:证书(MyPb)加上可选的链式证书
根据我的理解,ECDH将产生一个密钥。在共享我的临时公钥(QT)后,SDK会生成相同的密钥,因此我们以后可以交换使用相同密钥加密的JWE消息。
JSON {“MyPublicKey”: “QT”, “SDKPublicKey”:“ QC”} 将被签名并发送,但我不明白我将如何使用 apv 和 epk,因为这些标头参数用于 JWE,而不是在第一个要共享的 JWS 中。
在相同的规范中,他们谈论这些JWE消息,但他们没有这些apv和epk参数。
根据 JWE (RFC 7516) 使用与 SDK 相同的“enc”算法对 JSON 对象进行加密,该算法由 “kid” 和 JWE Compact 序列化标识。此版本的规范中支持的参数值为:
- “alg”: dir
- “enc”: A128CBC-HS256 或 A128GCM
- “孩子”:交易 ID
- 所有其他参数:不存在
我还阅读了RFC 7518中的示例,我可以看到正在使用的标头参数apv和epk,但我不确定哪些标头参数,JWE或JWS?
任何关于如何使用nimbus-jose-jwt或任何其他java库来实现它的想法都将是非常有帮助的。谢谢