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

RSA签名报“Bad data”错误求助,首次使用RSA遇问题

解决RSA签名时抛出"Bad data"异常的问题

看起来你刚接触RSA,踩了一个很常见的坑——错误地手动构造RSAParameters参数,这也是导致"Bad data"异常的核心原因。我来帮你拆解问题并给出修复方案:

你的代码核心错误

你现在直接把公钥/私钥的字符串用UnicodeEncoding转成字节数组,赋值给RSAParameters.Modulus、D这些属性,这完全不符合RSA参数的要求:

  • RSAParameters里的每个属性(比如Modulus模数、D私钥指数、Exponent公钥指数)都是大整数的二进制表示,而不是密钥字符串本身的字节。
  • 你还混淆了密钥的加载方式:.NET的RSACryptoServiceProvider已经提供了现成的方法导入密钥,不需要手动拆分参数。

修复后的代码示例

假设你的密钥是XML格式(这是.NET里最常用的RSA密钥格式),直接用FromXmlString导入私钥即可:

public void RSA()
{
    // 替换成你的私钥XML字符串(完整的私钥XML应该包含Modulus、D、P等所有参数)
    var privateKeyXml = "***";
    // 公钥用于验证签名,签名步骤不需要用到
    // var publicKeyXml = "***";

    using (var rsa = new RSACryptoServiceProvider())
    {
        // 直接导入私钥XML,无需手动设置RSAParameters
        rsa.FromXmlString(privateKeyXml);
        string signedMessage = SignData("ABC", rsa);
        Console.WriteLine("签名结果:" + signedMessage);
    }
}

public static string SignData(string message, RSACryptoServiceProvider rsa)
{
    byte[] signedBytes;
    // 用UTF-8编码转换文本,避免UnicodeEncoding的编码问题
    var encoder = new UTF8Encoding();
    byte[] originalData = encoder.GetBytes(message);

    try
    {
        // 使用SHA512哈希算法签名
        signedBytes = rsa.SignData(originalData, CryptoConfig.MapNameToOID("SHA512"));
    }
    catch (CryptographicException e)
    {
        Console.WriteLine("签名失败:" + e.Message);
        return null;
    }
    finally
    {
        rsa.PersistKeyInCsp = false;
    }

    return Convert.ToBase64String(signedBytes);
}

额外注意事项

  1. 密钥格式问题:如果你的密钥是PEM格式(比如开头是-----BEGIN RSA PRIVATE KEY-----),.NET Framework的RSACryptoServiceProvider对PEM支持有限,你需要手动解析PEM内容提取参数,或者升级到.NET Core/.NET 5+,使用RSA.Create()结合ImportFromPem方法导入。
  2. 签名只需要私钥:公钥是用来验证签名的,不需要在签名过程中使用。
  3. 不要手动构造RSAParameters:除非你完全理解RSA的每个参数含义,否则不要手动赋值,很容易因为参数缺失或格式错误导致异常。

内容的提问来源于stack exchange,提问作者Varsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:43