Java 如何在C#中解密JWE源(使用RSA1_5 A256CBC-HS512加密)?
我正在实现一个客户端,用于通过加密方式与某个服务器通信。客户端向服务器发送带有公钥RSA的get请求。文档“如何与服务器通信”中包含java代码示例。以下代码生成公钥:Java 如何在C#中解密JWE源(使用RSA1_5 A256CBC-HS512加密)?,java,c#,encryption,rsa,jwe,Java,C#,Encryption,Rsa,Jwe,我正在实现一个客户端,用于通过加密方式与某个服务器通信。客户端向服务器发送带有公钥RSA的get请求。文档“如何与服务器通信”中包含java代码示例。以下代码生成公钥: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keypair = keyGen.genKeyPair(); byte[] pubKeyBytes = keypair.getPublic
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keypair = keyGen.genKeyPair();
byte[] pubKeyBytes = keypair.getPublic().getEncoded();
我需要用C#实现我的客户机。我在C中找到了同样的方法:
客户端使用参数和解决方案,这没关系。客户端可以生成可以在服务器上通过验证的密钥。
结果,我得到了加密的响应并试图解密它
responseContent = rsa.Decrypt(responseContent)
但此代码引发以下异常:
系统。安全。加密。加密异常:“要删除的数据”
解密超出了此模数256字节的最大值。'
responseContent是长度为250996的字节数组。正如我看到的,不可能通过上面的方式解密响应内容
从文件中,我知道
另外,我还有一个如何用java解密响应的示例:
JWEObject jweObject = JWEObject.parse(encryptedPayload);
RSAPrivateKey rsaPrivatteKey = (RSAPrivateKey)KeyFactory
.getInstance("RSA")
.generatePrivate(new PKCS8EncodedKeySpec(keybytes));
RSADecrypter RSADecrypter rsaDecrypter= new RSADecrypter(rsaPrivateKey);
JWEObject jweObject.decrypt(rsaDecrypter);
String decryptedResponse = jweObject.getPayload().toString();
我认为rsa.Decrypt类似于上面的代码。但当我播种时——不是。
经过一些研究,我发现我的回答是JWE来源。
基于此,我将响应拆分为以“.”分隔的部分,并从base64url对每个部分进行解码。因此,我:
- 标头(是JSON:{“enc:“A256CBC-HS512”,“alg:“RSA1_5”})
- 加密密钥(大小为256字节)
- 初始化向量(大小为16字节)
- 密文(大小1844688字节)
- 身份验证标记(大小为32字节)
JWT.Decode(responseContent, // content as String read from Response
rsa, // RSACryptoServiceProvider
JweAlgorithm.RSA1_5,
JweEncryption.A256CBC_HS512);
当您需要“使用RSA”加密大量数据时,您实际上会生成一个唯一的对称算法密钥(例如,AES密钥),用它加密数据,用RSA密钥加密对称密钥,并同时发送RSA加密密钥和AES加密数据。可能与JWE相关的代码会解析这样一个数据包并反转过程,而
rsa.Decrypt
只执行纯rsa解密。试着看看JWEObject
handling到底做了什么。JWEObject中的JWE用于“JSON Web加密”:。所以这些字节不是真正加密的有效负载。它是JSON,包含加密的有效载荷+关于如何解密的有用信息。@Evk现在我从另一个视图的文档中理解了“加密的JSON”。
JWT.Decode(responseContent, // content as String read from Response
rsa, // RSACryptoServiceProvider
JweAlgorithm.RSA1_5,
JweEncryption.A256CBC_HS512);