gpt4 book ai didi

java - 用 Java 实现 Diffie-Hellman key 交换

转载 作者:太空狗 更新时间:2023-10-29 22:41:26 27 4
gpt4 key购买 nike

我正在尝试用 Java 实现 Diffie-Hellman key 交换,但我很难理解规范:

Complete the Diffie-Hellman key exchange process as a local mechanismaccording to JWA (RFC 7518) in Direct Key Agreement mode using curveP-256, dT and QC to produce a pair of CEKs (one for each direction)which are identified by Transaction ID. The parameter values supportedin this version of the specification are:

  • “alg”: ECDH-ES
  • “apv”: SDK Reference Number
  • “epk”: QC, in JSON Web Key (JWK) format
  • {“kty”:”EC” “crv”:“P-256”}
  • All other parameters: not present
  • CEK: “kty”:oct - 256 bits

Create a JSON object of the following data as the JWS payload to besigned:

{“MyPublicKey”: “QT”, “SDKPublicKey”:” QC”}

Generate a digital signature of the full JSON object according to JWS(RFC 7515) using JWS Compact Serialization. The parameter valuessupported in this version of the specification are:

  • “alg”: PS256 or ES256
  • “x5c”: X.5C v3: Cert(MyPb) plus optionally chaining certificates

据我了解,ECDH 会生成一个 key 。共享我的临时公钥 (QT) 后,SDK 会生成相同的 key ,因此我们稍后可以交换使用相同 key 加密的 JWE 消息。

JSON {“MyPublicKey”: “QT”, “SDKPublicKey”:”QC”} 将被签名并发送,但我不明白我将如何使用 apvepk 因为这些 header 参数在 JWE 中使用,而不是在要共享的第一个 JWS 中使用。

在同一个规范上,他们谈论这些JWE消息,但是他们没有这些apv和epk参数。

Encrypt the JSON object according to JWE (RFC 7516) using the same“enc” algorithm used by the SDK, the CEK obtained identified by “kid”and JWE Compact Serialization. The parameter values supported in thisversion of the specification are:

  • “alg”: dir
  • “enc”: either A128CBC-HS256 or A128GCM
  • “kid”: Transaction ID
  • All other parameters: not present

我还阅读了 RFC 7518 中的示例我在哪里可以看到正在使用的 header 参数 apv 和 epk,但我不确定哪个 header 参数是 JWE 还是 JWS?

任何关于如何使用 nimbus-jose-jwt 或任何其他 java 库实现的想法都会非常有帮助。谢谢

最佳答案

apv (Agreement PartyVInfo) 和epk (Ephemeral Public Key) 都是可选的,因此可以有多种使用方式。例如,您可以使用 apv 来反射(reflect) SDK 版本。它们被添加到 JWE header 中。

You can read more about JWE in Nimbus here

一个使用 Nimbus JOSE 的例子是:

import java.net.URI;
import java.net.URISyntaxException;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.nimbusds.jose.*;
import com.nimbusds.jose.jwk.Curve;
import com.nimbusds.jose.jwk.ECKey;
import com.nimbusds.jose.jwk.KeyOperation;
import com.nimbusds.jose.jwk.KeyUse;
import com.nimbusds.jose.util.Base64;
import com.nimbusds.jose.util.Base64URL;

public class Security {

public void generateJWE() throws JOSEException, URISyntaxException {
JWEHeader jweHeader = buildJWEHeader(new Base64URL("202333517"), buildECKey());
JWEObject jweObject = new JWEObject(jweHeader, new Payload("Hello World!"));
}

private JWEHeader buildJWEHeader(Base64URL apv, ECKey epk) {
JWEHeader.Builder jweBuilder = new JWEHeader.Builder(JWEAlgorithm.ECDH_ES, EncryptionMethod.A128GCM);
jweBuilder.agreementPartyVInfo(apv);
jweBuilder.ephemeralPublicKey(epk);
return jweBuilder.build();
}

private ECKey buildECKey() throws URISyntaxException {
Set<KeyOperation> keyOperations = new HashSet<>();
keyOperations.add(KeyOperation.ENCRYPT);
String transactionID = "73024831";
URI x5u = new URI("https//website.certificate");
KeyStore keystore = null; //initialize it
List<Base64> x5c = new ArrayList<>();
return new ECKey(Curve.P_256, new Base64URL("x"), new Base64URL("y"), KeyUse.ENCRYPTION, keyOperations, Algorithm.NONE, transactionID, x5u, new Base64URL("x5t"), new Base64URL("x5t256"), x5c, keystore);
}
}

您可以按照您的规范使用 EncryptionMethod.A128CBC-HS256 而不是 EncryptionMethod.A128GCMapvepk 被添加到构建器内部的 JWEHeader 中。 其他参数可以在 JWEHeader.Builder 和 ECKey 的构造函数中选择。我使用ECDH-ES算法,A128GCM加密方式,P-256曲线(ECKey生成默认椭圆曲线), 交易 ID 是一个字符串。我选择了其他没有任何明确模式的参数。 KeyStore 的初始化对于示例来说过于宽泛。除了签名和其他功能之外,加密只是您可以使用 JWE 做的一件事。

关于java - 用 Java 实现 Diffie-Hellman key 交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46223656/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com