使用RSACryptoServiceProvider的Decrypt方法时出现“参数不正确”错误,加密解密使用同一密钥对,请求问题排查帮助
解决RSACryptoServiceProvider解密时"The parameter is incorrect"错误
嘿,我看到你在用RSACryptoServiceProvider的Decrypt方法时碰到了这个头疼的错误,咱们直接揪出代码里的核心问题——解密过程中对密文字节数组的处理逻辑错了,这才导致了参数不正确的报错。
问题根源
在你的Decrypt方法里,这行代码是罪魁祸首:
byte[] bi = (new System.Text.UnicodeEncoding()).GetBytes(System.Text.UnicodeEncoding.Unicode.GetString(System.Convert.FromBase64String(Crypt)));
你把Base64格式的密文先解码成字节数组,然后转成Unicode字符串,再转回字节数组。这个过程会破坏原始的加密字节数据——因为Unicode编码会把某些字节序列转换成特定字符,再转回来的时候就不是原来的加密字节了,解密自然就失败了。
修正后的解密方法
只需要把密文直接从Base64解码成字节数组,不需要经过Unicode编码的中间步骤。修正后的Decrypt方法如下:
private static string Decrypt(string Crypt) { // Crypt Provider CspParameters CSPParam = new CspParameters(); CSPParam.Flags = CspProviderFlags.UseMachineKeyStore; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(CSPParam); // Crypt Params string k = System.Text.UnicodeEncoding.Unicode.GetString(System.Convert.FromBase64String(Key)); rsa.FromXmlString(k); // Decrypt - 修正字节数组处理逻辑 byte[] bi = System.Convert.FromBase64String(Crypt); byte[] bdecr = rsa.Decrypt(bi, false); // Return results return new System.Text.UnicodeEncoding().GetString(bdecr); }
额外注意事项
- 确保密钥包含私钥:
Decrypt方法必须使用包含私钥的RSA密钥对,你的Key是Base64编码的XML,要确认XML里有<D>(私钥参数)这类字段(从你提供的内容看应该是符合的,但可以自行检查)。 - 保持
fOAEP参数一致:你加密和解密都用了false,这是正确的,如果两边参数不一致(比如加密用true解密用false)也会触发类似错误。 - 简化编码写法:可以用
Encoding.Unicode代替new System.Text.UnicodeEncoding(),代码会更简洁易读。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

