You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:37:39