Java 如何在C#中解密JWE源(使用RSA1_5 A256CBC-HS512加密)?

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

我正在实现一个客户端,用于通过加密方式与某个服务器通信。客户端向服务器发送带有公钥RSA的get请求。文档“如何与服务器通信”中包含java代码示例。以下代码生成公钥:

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字节)
我想主要内容是密文,我需要解密它。但我不知道怎么做,因为密文大小超过256字节,我不能使用rsa.Decrypt

当源代码的大小超过RSA密钥时,如何解密源代码?

我发现这个库可以完全满足我的需要。我将其添加为NuGet包,编写了以下代码:

 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);