关于c#:使用RSACryptoServiceProvider.Decrypt解密

Decrypting using RSACryptoServiceProvider.Decrypt

我正在尝试解密消息,作为密钥交换的一部分。我有一个用于生成证书的2048位RSA私钥。我收到一条消息,这是HTTP请求的一部分,我需要使用私钥对其进行解密。但是,执行最后一行时,我收到以下错误消息:

"要解密的数据超出了此模数256字节的最大值。"

我尝试减少数据的字节数组以进行解密以及反转。如果执行这两个操作中的任何一个,则会收到"错误数据"错误。

任何帮助将不胜感激。

要解码的消息示例:

ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0 =

C#代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        //http request containing the HMAC key which is encrypted against the public key
        hmacKey = oCtx.RequestContext.RequestMessage.ToString();
        hmacKey = hmacKey.Remove(0, 8);
        hmacKey = hmacKey.Remove(hmacKey.Length - 9);

        //decode into binary using Base64
        byte[] data = Convert.FromBase64String(hmacKey);

        string publicCert ="-----BEGIN CERTIFICATE-----......-----END CERTIFICATE-----";
        string privateKey ="-----BEGIN RSA PRIVATE KEY-----......-----END RSA PRIVATE KEY-----";

        byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
        byte[] keyBuffer = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);

        X509Certificate2 x509cert = new X509Certificate2(certBuffer);

        RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
        x509cert.PrivateKey = prov;

        //tried to reduce the size of the data to decrypt as well as reversing it
        //Array.Resize(ref data, 32);
        //Array.Reverse(data);

        byte[] result = prov.Decrypt(data, false);

有关GetBytesFromPEM方法的更多信息,可从以下示例中获得:
http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

更新:

尝试解码两次,得到以下结果:

代码:

1
2
3
4
5
6
7
        .....
        byte[] data2 = Convert.FromBase64String(hmacKey);
        string abc = Encoding.Default.GetString(data2);
        byte[] data = Convert.FromBase64String(abc);
        .....
        byte[] result = prov.Decrypt(data, false);
        string result2 = Encoding.Default.GetString(result);

结果:

?" h @-???? z; C ?? 7
。?? a?¢"?£ ??????? R?¨?±?y ?? K。


这些错误基本上是由于编码错误所致,包括二进制编码(base 64)问题和字符编码问题(UTF-8 / UTF-16)。

  • 通常,您希望对二进制HMAC进行加密。取而代之的是,HMAC是十六进制编码的,而十六进制编码又是使用ASCII编码(与UTF-8兼容)编码的。但是.NET的默认值为UTF-16LE(.NET会错误地调用Unicode编码)。

  • 生成的密文采用base 64编码,如果结果需要以文本形式传输,则这是您所期望的。相反,似乎已经使用了双基64。由于base 64解码产生了另一个base 64编码的字符串,因此结果太大,RSA解密无法处理。