简体   繁体   English

使用RSACryptoServiceProvider.Decrypt解密

[英]Decrypting using RSACryptoServiceProvider.Decrypt

I'm trying to decrypt a message as part of a key exchange. 我正在尝试解密消息,作为密钥交换的一部分。 I've got a 2048 bit RSA private key which I used to generate a certificate. 我有一个2048位RSA私钥,用于生成证书。 I receive a message as part of a HTTP request which I need to decrypt with my private key. 我收到一条消息,这是HTTP请求的一部分,需要使用私钥进行解密。 However, I receive the following error message when executing the last line: 但是,执行最后一行时,我收到以下错误消息:

"The data to be decrypted exceeds the maximum for this modulus of 256 bytes." “要解密的数据超出了此模数256字节的最大值。”

I've tried reducing the byte array of the data to decrypt as well as reversing it. 我尝试减少数据的字节数组以解密以及将其反转。 If I do any of those two, I receive a "Bad Data" error. 如果我执行这两个操作中的任何一个,则会收到“错误数据”错误。

Any help would be greatly appreciated. 任何帮助将不胜感激。

Example of message to decode: 解码消息示例:

ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0= ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0 =

C# code: C#代码:

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

More info on the GetBytesFromPEM method is available from this example: http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back 此示例提供了有关GetBytesFromPEM方法的更多信息: http : //www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

UPDATE: 更新:

Trying to decode twice, I get the following result: 尝试解码两次,得到以下结果:

code: 码:

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

result: 结果:

Óh@-šÚz;CÏ7 .«™"ã®ÿRè±àyéK. Óh@-šÚz;CÏ7。«™”ã®ÿRè±àyéK。

The errors are basically due to encoding errors, both binary encoding (base 64) issues and character encoding issues (UTF-8/UTF-16). 该错误基本上是由编码错误引起的,包括二进制编码(base 64)问题和字符编码问题(UTF-8 / UTF-16)。

  1. Usually you would expect a binary HMAC to be encrypted. 通常,您希望对二进制 HMAC进行加密。 Instead the HMAC was hex encoded, which in turn was encoded using ASCII encoding (which is compatible with UTF-8). 相反,HMAC是十六进制编码的,而十六进制编码又使用ASCII编码(与UTF-8兼容)编码。 The .NET default is however UTF-16LE (what .NET incorrectly calls Unicode encoding). .NET的默认值为UTF-16LE(.NET错误地调用Unicode编码)。

  2. The resulting ciphertext was base 64 encoded, which is what you would expect if the result needs to be transported in text. 生成的密文采用base 64编码, 如果结果需要以文本形式传输,这就是您所期望的。 Instead double base 64 seemed to have been utilized. 相反,似乎已经使用了双基64。 As the base 64 decoding resulted in another base 64 encoded string, the result was too large for the RSA decryption to handle. 由于base 64解码产生了另一个base 64编码的字符串,因此结果太大,RSA解密无法处理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RSACryptoServiceProvider.Decrypt() 可以返回不正确的数据吗? - Can RSACryptoServiceProvider.Decrypt() return incorrect data? CryptographicException:未知错误“ 80007005”。 在.Net Compact Framework中调用RSACryptoServiceProvider.Decrypt()时 - CryptographicException: Unknown Error '80007005'. when calling RSACryptoServiceProvider.Decrypt() in .Net Compact Framework RSACryptoServiceProvider使用公钥解密失败 - RSACryptoServiceProvider Decrypt failing using public key 如何使用 RSACryptoServiceProvider 解密加密文本? - how to decrypt an encrypted text using RSACryptoServiceProvider? RSACryptoServiceProvider仅使用私钥解密 - RSACryptoServiceProvider decrypt using only private key 使用RSACryptoServiceProvider使用过期的证书加密/解密数据没有错误 - No error encrypting / decrypting data with an expired certificate using RSACryptoServiceProvider 通过RSACryptoServiceProvider加密/解密文件 - encrypt/decrypt file by RSACryptoServiceProvider RSACryptoServiceProvider - 解密 - 参数不正确 - RSACryptoServiceProvider - Decrypt - The parameter is incorrect RSACryptoServiceProvider使用自己的公钥和私钥加密和解密 - RSACryptoServiceProvider encrypt and decrypt using own public and private key 如何在Ubuntu中使用RSACryptoServiceProvider()解密c#中的加密数据? - How to decrypt an encrypted data in c# by using RSACryptoServiceProvider() in ubuntu?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM