- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试用 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”} 将被签名并发送,但我不明白我将如何使用 apv 和 epk 因为这些 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.A128GCM
。 apv
和 epk
被添加到构建器内部的 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/
一些快速背景。我使用 rclone 将数据传输到 SFTP 服务器。 rclone 是用 Golang 编写的,并在底层使用 lib crypto。当我们尝试与 SFTP 服务器建立 ssh 连接时,
我将 FIPS 186-3 推荐的曲线用于 Diffie-Hellman 椭圆曲线。我正在尝试确定私钥的最大长度,根据 RFC 5915 应该是: 天花板 (log2(n)/8) ,其中 n 是曲线的
我正在做一个项目,Alice 和 Bob 使用 Diffie-Hellman key 交换相互发送消息。让我陷入困境的是如何将他们正在使用的证书合并到其中,以便我可以获得他们的 secret 消息。
也许在这里问这个问题不太合适......无论如何,我正在尝试使用 gmp 库来实现 DH,但我遇到的问题是: 有一次,当我进行测试以观察输出时,尽管选择了较大的素数和私钥值: p 的十进制长度大约超过
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我在 JavaCard 上遇到 DiffieHellman 问题。我有这门课: https://pastebin.com/2F2sQ2Pe (https://github.com/ASKGLab/DH
所以我正在尝试进行客户端-服务器 diffie hellman 加密。我使用这个:serverPublicKey = (int)Math.pow(generator,serverPrivateKey)
上下文 我在看这个视频DHE explained 它讲的是两个人如何在没有吸管的情况下交换 key 以了解更多信息。 根据视频实现 // INITIALIZERS (video's values)--
我有一个像这样的 Diffie–Hellman 安全类: public class AESSecurityCap { private PublicKey publicKey; KeyA
嗨,我正在尝试实现 Diffie–Hellman key 交换 public static Integer secret = 100000; public static BigInteger g =
我遇到了一个挑战,它与测试 friend 的加密过程有关。 这是一个Diffie-Hellman交换过程,这里是已知的变量/常量: P, G 我生成的私钥(可变) 我生成的公钥(变量) 收件人公钥(常
我有下面这行代码来生成私钥: int Xa = randomNo.nextInt(10000); int Ya = (int) Math.pow(G, Xa) % P; G 和 P 是静态数字。而 X
我正在编写 Pohlig-Hellman 算法,但我在根据算法定义理解算法中的步骤时遇到问题。 通过 algorithm 的 Wiki : 我知道第一部分 1) 是计算 p-1 的素数 - 这很好。
我正在尝试设计一种安全方案,用于加密 silverlight 客户端和我创建的 php web 服务之间的应用程序级数据。由于我正在处理一个公共(public)网站,因此我从服务中提取的信息是公开的,
所以我在阅读 this并对莱姆斯的回答感到惊讶。因为我认为情况正好相反。 所以,至于我的问题。为什么使用 diffie-hellman key 交换来确定共享 key 来加密/解密消息的程序(通常)不
是否有实现 diffie helman 的 Python 标准库? 我已经查看了 python pyopenssl 中的 openssl 包装器,但它没有涵盖它。 我也无法在 NaCl 或 crypt
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我正在尝试实现 Diffie-Hellman key 交换。我对生成后如何使用 key 有点困惑。 如输出所示,2 个 key 是在 key 交换中使用相同的质数和基数生成的,并在生成 key 时交换
我需要进行单元测试来检查 Diffie-Hellman key 协议(protocol)协议(protocol)的实现是否正常,所以我需要测试向量来验证。问题是我在互联网上的任何地方都找不到它们。 R
Elliptic 曲线 diffie hellman 计算看起来与此处定义的标准曲线有什么不同: /* * The basic Diffie-Hell
我是一名优秀的程序员,十分优秀!