C# RSACryptServiceProvider在windows上验证失败

C# RSACryptServiceProvider在windows上验证失败,c#,windows,rsa,C#,Windows,Rsa,我正在尝试用java中的RSA私钥进行签名,并在C#中进行验证。验证代码在使用VS(xamarin)的iMac上运行良好,但在Windows 10上总是返回false。C#代码如下: RSAParameters rsaPars = new RSAParameters(); rsaPars.Modulus = Convert.FromBase64String("AKZXGikjSCLZT2CfhPguEA4ZDVEmCBwNvSVagkPFDnz3kLvbSXus51stJ7iUedocrGWg

我正在尝试用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和windowns上的原始数据,它们是相同的。如果我在C#代码中生成密钥,它在windows上运行良好

privateKey = RSAalg.ExportParameters(true);
publicKey = RSAalg.ExportParameters(false);
知道问题出在哪里吗


谢谢

如果我以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);
}
rsaPars;
使用(RSACryptoServiceProvider RSA=新的RSACryptoServiceProvider(4096))
{
RSA.FromXmlString(@"这一研究表明,他们在一个新的研究领域中使用了一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的技术,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种技术,一种新的研究成果,一种新的一种新的研究,一种新的合作合作合作合作,一种新的合作合作合作合作合作的合作的合作,一种新的合作,一种新的合作的合作,一种新的合作,一种新的合作,一种新的合作,一种新的研究,一种新的一种新的一种新的理论,新的理论,新的理论,新的理论,新的理论,新的理论,新的理论,一NRKJNGKIYD2SOOSHXW/+RD5RcGFf1js2)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8 8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8(8)8)8)8)8)8)8)8)8)8(8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)8)XSPGPZKGSU7GOUI7W/Q9nMN9HCLUjAQAB”);
rsaPars=RSA.ExportParameters(false);
}

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

您的模数值以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(vs 4096),并且由于签名是512字节(而不是513),因此“自动不正确”


从理论上讲,另一种解决方案是在签名中添加一个填充字节;但使模值在平台上正确似乎更好。

不太确定这是一个答案。在这之后,你还有问题吗?是的,问题仍然存在于windows操作系统上,但我发布的答案是针对windows的解决方案。两者都有在mac上工作正常。我仍然不知道windows上的第一个有什么问题。如果有人知道这个问题那就太好了谢谢!模数是从java导出的。
byte[]ModulesBytes=publicKey.GetModules().toByteArray()
我在mac上调试,在0上运行正常,但在windows上失败。很高兴知道原因problem@keapeJava必须以PKCS1编码的整数有效负载样式导出它。因此Java需要前导0x00,而.NET可能会被它弄糊涂:)