繁体   English   中英

使用RSACryptoServiceProvider.Decrypt解密

[英]Decrypting using RSACryptoServiceProvider.Decrypt

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

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

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

任何帮助将不胜感激。

解码消息示例:

ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0 =

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

此示例提供了有关GetBytesFromPEM方法的更多信息: http : //www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

更新:

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

码:

        .....
        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。«™”ã®ÿRè±àyéK。

该错误基本上是由编码错误引起的,包括二进制编码(base 64)问题和字符编码问题(UTF-8 / UTF-16)。

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

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

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM