我正在实现一个客户端,以通过密码学方式与某个服务器进行通信。客户端向服务器发送带有公共 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 密钥时如何解密源?