c# - RSACryptoServiceProvider 在 Windows 上验证失败

标签 c# windows rsa

我正在尝试在 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# 代码中生成 key ,它在 Windows 上运行得很好。

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

知道这可能是什么问题吗?

谢谢

最佳答案

您的 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,因此它认为 key 大小是 4104(与 4096),并且由于签名是 512 字节(而不是 513),因此它“自动不正确” ”。

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

关于c# - RSACryptoServiceProvider 在 Windows 上验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493281/

相关文章:

java - 为什么我的 RSA 2048 公钥是 294 字节长?

c# - 如何在 RSAParameters 上设置公钥和私钥以用于 RSACryptoServiceProvider?

c# - 仅在找到/存在实例时才使用 Redis 进行缓存?

python - 如何清除解释器控制台?

c# - IIS 中的 WCF NetTcpBinding

javascript - 无法连接到蓝牙 LE 设备,DevicePairingResultStatus.Failed

windows - 如果在管理员模式下运行,批处理文件的工作方式会有所不同

java - Android RSA key 对生成-我应该使用标准Java/Bouncy CaSTLe/海绵城堡/JSch/其他吗?

c# - C# 中的 OAuth 作为客户端

c# - 使用 Entity Framework 添加具有读/写操作和 View 的 Controller - "Data Context class"是什么?