1

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

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keypair = keyGen.genKeyPair();
byte[] pubKeyBytes = keypair.getPublic().getEncoded();

我需要在 C# 中实现我的客户端。我找到了如何在 C# 中执行相同操作的方法:

var rsa = new RSACryptoServiceProvider(2048);
var parameters = _rsa.ExportParameters(includePrivateParameters: false);

客户端使用如何调整 C# 的公钥/私钥 RSA 密钥以在 Java 中使用它们的参数和解决方案?没关系。客户端可以生成可以通过服务器验证的密钥。结果,我得到了加密的响应并试图解密它。

responseContent = rsa.Decrypt(responseContent)

但是此代码引发以下异常:

System.Security.Cryptography.CryptographicException: '要解密的数据超过了这个 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 来源。基于https://www.rfc-editor.org/rfc/rfc7516,我将回复拆分为由“。”分隔的部分。并从 base64url 解码它们中的每一个。结果我有:

  • 标头(即 JSON:{"enc":"A256CBC-HS512", "alg":"RSA1_5"})
  • 加密密钥(大小 256 字节)
  • 初始化向量(大小 16 字节)
  • 密文(大小 1844688 字节)
  • 身份验证标签(大小 32 字节)

我认为主要内容在Cipertext中,我需要对其进行解密。但我不知道如何因为Cipertext大小超过 256 个字节,我不能使用 rsa.Decrypt。

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

4

1 回答 1

1

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

 JWT.Decode(responseContent, // content as String read from Response
            rsa, // RSACryptoServiceProvider
            JweAlgorithm.RSA1_5, 
            JweEncryption.A256CBC_HS512); 

并因此解密了内容。

于 2018-03-19T17:30:09.587 回答