【问题标题】:RSACryptoServiceProvider failed to verify on windowsRSACryptoServiceProvider 无法在 Windows 上验证
【发布时间】:2018-03-26 13:58:56
【问题描述】:

我正在尝试在 java 中使用 RSA 私钥签名并在 C# 中验证它。验证代码在我的带有 VS (xamarin) 的 iMac 上运行良好,但在 Windows 10 上总是返回 false。C# 代码在这里:

RSAParameters rsaPars = new RSAParameters();

rsaPars.Modulus = Convert.FromBase64String("AKZXGikjSCLZT2CfhPguEA4ZDVEmCBwNvSVagkPFDnz3kLvbSXus51stJ7iUedocrGWgeilbVJoKP9cTqtZ8dyRwpokU55Kixk5JFf+5wS/SZtPs84eHPDfTC9C9Gg97/krFyGq7fikdoJpuRQBaBh1qqxGA6C+vzO49xGIiWeUA0+u9M2/PA/y7EhgZngKhhzGiU+KWhawctFAokCFX9kBhgmxVxM6EyJdD3RppEnhsza6VORHcnTnOgetZJML9WE7FX8sDO82DvnCv4UIR5YzN8W8nqLLp/RZyZkzmRGXIItUYW2VEvTV6/I2SVLNrKJNgKIYD2SOOSHXw/+RD5RcGFf1jsLP/ZF8JxAayywjDwCY0FsvyWHrWJMPPWQWPw30+Nk6pqY9OIiD/Z7xCTdmO6H8xV/SRyKRe8YdAS6Wuro6l/MnoPv+eqh/gc958RkC7BQmWtzN/UDbx/bqU4nJ2YLF37ZeKjMjqea7n3aOO/pwMQSqp96E/CImprm5lXdso+/RPzAslktMaTom++/4wtr4mxynDy+KPml9qDFCxHpvuIxF1w8fBaBKTpBXQlgi5o0ZdbXl5kalYjnkMbZ903bcSC1tEbhMVQCSJ5qvCulKWMWmbB5HWSx1QRcVkz0fUVuYfrm20m0MXSpgpZkGSU7gouI7W/Q9nMN9HCLUj");
rsaPars.Exponent = Convert.FromBase64String("AQAB");
string signature = "doBEnIGZXCtzI7Iwfl3akr2Jk+jtDloXjZeB8aeEmpoElpqPNevC3z9tNRC1yCsmECx9a92hj9E5Z2QXY5bvHxsxf9uH2INcdN4ORBQxWH5znI3qLIMVjXMJ7NM2g+5S64weCV3YDH8+93q2zUX/dvoJNYuUTn4ZeTZIoIuuIdHssZn+tRQt8smYX1FIbLnS+2catX76hfpgJPrAQE2eukDdnJ5S/mIN09+G4mI9a3n9FNUVr2b7+uUGfX9RabUQwHjZK64kUTWui+j1GEDKXf2Lb0TjTwM+AuAAwKcOHttoX8Np3z+AQsRQfQe8XFxyEWaVwgf77R+Xru0e+z2ASF392xpuDQDdDQoMuaKpFn6FvFgs5FHM1v/YGm3QD1IgJfslZ7DmHZh25g6kg5scj3D2nQtnM8CfPdQNIA8r4cjLgESgx5O30s/K5liNeTlGdIj+mhZZ8ZHldi+Kps5Tk/rtkWSkdKylzFb6p6JVZRRa7Ks0Z52oKoGVcPWQbALYu08I1KILynGwVIWy4fgf9BzvbAWhCnfkVynl5gfNaDKSuuysTEOM1l08YfeSnpR8D4NZeOJuKnZT1dKbHqNGpCK7sXpLaaP0UZhCcBfW55wBADE7vhbX5HcL3bXLbFbsrA5/CO9AHrz7f8Xx+VQdv+qS1YixzHb1o741c6EK6qw=";

byte[] dataToSign = Encoding.UTF8.GetBytes("Data to Sign");
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096))
{
    RSA.ImportParameters(rsaPars);
    Console.WriteLine(RSA.VerifyData(dataToSign, "SHA1", Convert.FromBase64String(signature)));
}

我在 mac 和 windows 上都运行了确切的代码。一开始我以为是编码问题。我比较了mac和windows上的那些原始数据,它们是一样的。如果我在 C# 代码中生成密钥,它在 Windows 上运行良好。

privateKey = RSAalg.ExportParameters(true);
publicKey = RSAalg.ExportParameters(false);

知道可能是什么问题吗?

谢谢

【问题讨论】:

    标签: c# windows rsa


    【解决方案1】:

    您的 Modulus 值以 0x00 开头,可能是因为 Xamarin/Mono 未正确导出它。

    如果您重新编码模值以删除前导 0x00(或执行类似的操作

    if (rsaPars.Modulus[0] == 0)
    {
        byte[] tmp = new byte[rsaPars.Modulus.Length - 1];
        Buffer.BlockCopy(rsaPars.Modulus, 1, tmp, 0, tmp.Length);
        rsaPars.Modulus = tmp;
    }
    

    ) 那么你的问题应该会消失。

    可能在 Windows 10 中发生了一些变化,它没有意识到前导字节是 0x00,因此它认为密钥大小是 4104(与 4096 相比),并且由于签名是 512 字节(而不是 513),它“自动不正确” ”。

    理论上,另一种解决方法是在签名中也添加一个填充字节;但使 Modulus 值适合平台似乎更好。

    【讨论】:

    • 谢谢!模数是从 java 导出的。 byte[] modulusBytes = publicKey.getModulus().toByteArray(); 我在 mac 上调试过,它在 0 上运行良好,但在 windows 上失败了。很高兴知道这个问题的原因
    • @keape 啊。 Java 必须以 PKCS1 编码整数有效负载样式导出它。所以 Java 想要领先的 0x00,而 .NET 可能会被它弄糊涂:)
    【解决方案2】:

    如果我以 xml 格式解析相同的公钥,它可以在 mac 和 windows 上运行

    RSAParameters rsaPars;
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096))
    {
        RSA.FromXmlString(@"<RSAKeyValue><Modulus>AKZXGikjSCLZT2CfhPguEA4ZDVEmCBwNvSVagkPFDnz3kLvbSXus51stJ7iUedocrGWgeilbVJoKP9cTqtZ8dyRwpokU55Kixk5JFf+5wS/SZtPs84eHPDfTC9C9Gg97/krFyGq7fikdoJpuRQBaBh1qqxGA6C+vzO49xGIiWeUA0+u9M2/PA/y7EhgZngKhhzGiU+KWhawctFAokCFX9kBhgmxVxM6EyJdD3RppEnhsza6VORHcnTnOgetZJML9WE7FX8sDO82DvnCv4UIR5YzN8W8nqLLp/RZyZkzmRGXIItUYW2VEvTV6/I2SVLNrKJNgKIYD2SOOSHXw/+RD5RcGFf1jsLP/ZF8JxAayywjDwCY0FsvyWHrWJMPPWQWPw30+Nk6pqY9OIiD/Z7xCTdmO6H8xV/SRyKRe8YdAS6Wuro6l/MnoPv+eqh/gc958RkC7BQmWtzN/UDbx/bqU4nJ2YLF37ZeKjMjqea7n3aOO/pwMQSqp96E/CImprm5lXdso+/RPzAslktMaTom++/4wtr4mxynDy+KPml9qDFCxHpvuIxF1w8fBaBKTpBXQlgi5o0ZdbXl5kalYjnkMbZ903bcSC1tEbhMVQCSJ5qvCulKWMWmbB5HWSx1QRcVkz0fUVuYfrm20m0MXSpgpZkGSU7gouI7W/Q9nMN9HCLUj</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>");
        rsaPars = RSA.ExportParameters(false);
    }
    

    在 Windows 上直接将模数和指数设置为公钥似乎不起作用

    【讨论】:

    • 不太确定这是一个答案。在此之后您还有疑问/问题吗?
    • 是的,Windows 操作系统上仍然存在问题,但我发布的答案是 Windows 的解决方案。两者都可以在 mac 上正常工作。我仍然不知道Windows上的第一个有什么问题。如果有人知道问题,那就太好了
    猜你喜欢
    • 2015-09-05
    • 2018-08-06
    • 2019-08-25
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多