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解密无法处理。