C# .NET中的RSA加密-JAVA中的解密->;Java抛出;“模数不为正”;错误
我与我们的第三方供应商在实施sso时遇到问题。他们在验证我的签名时收到以下错误:C# .NET中的RSA加密-JAVA中的解密->;Java抛出;“模数不为正”;错误,c#,java,.net,rsa,encryption-asymmetric,C#,Java,.net,Rsa,Encryption Asymmetric,我与我们的第三方供应商在实施sso时遇到问题。他们在验证我的签名时收到以下错误: public string MD5withRSASignature(string encryptedStringToSign) { byte[] signature; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024)) { XmlDocum
public string MD5withRSASignature(string encryptedStringToSign)
{
byte[] signature;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024))
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(PRIVATE_KEY_PATH);
rsa.FromXmlString(xDoc.OuterXml);
byte[] bytes = Encoding.UTF8.GetBytes(encryptedStringToSign);
signature = rsa.SignData(bytes, new MD5CryptoServiceProvider());
}
return Convert.ToBase64String(signature);
}
java.lang.arithmetricException:biginger:module非正——位于java.math.biginger.modPow(biginger.java:1556)
我无法控制他们的Java代码。以下是我现在正在做的事情:
我使用以下代码在C#中创建了一个密钥对:
CspParameters csp = new CspParameters();
csp.KeyNumber = (int)KeyNumber.Signature;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024, csp))
{
File.AppendAllText(path + "PrivateKey.xml", rsa.ToXmlString(true));
File.AppendAllText(path + "PublicKey.xml", rsa.ToXmlString(false));
}
以下是签名的代码:
public string MD5withRSASignature(string encryptedStringToSign)
{
byte[] signature;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024))
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(PRIVATE_KEY_PATH);
rsa.FromXmlString(xDoc.OuterXml);
byte[] bytes = Encoding.UTF8.GetBytes(encryptedStringToSign);
signature = rsa.SignData(bytes, new MD5CryptoServiceProvider());
}
return Convert.ToBase64String(signature);
}
(是的,我知道私钥应该在密钥存储中)
下面是他们用来转换xml键的代码(这是Java)
例外情况与Java使用的RSA公钥有关。您的任何代码都不能解决这一点。Java端是如何获得该密钥的,使用的是什么格式
可以解释该错误的一个常见错误是,如果模数转换为字节数组,但前导零字节在需要时不存在。基本上,它的使用比第一次出现时要复杂一些。它是为与DER编码的ASN.1整数兼容而设计的。结果是,如果模的第一个字节
b
设置了高位,即128,那么您可以发布所有Java异常堆栈吗?不幸的是,我不能。他们拒绝提供。这似乎来自标准的JavaRSA类,我请求并获得了它们的XML密钥转换代码。请参见上文,我以xml格式生成密钥并将其发送过来。我得到了他们的代码,该代码采用xml格式的密钥并进行转换。这里的问题是BigInteger构造函数吗?如何在xml密钥中将0字节前置为模数?(上面的代码)证明我没有使用正确的密钥格式(PKCS#8),只是使用了.NET吐出的任何内容。谢谢你,你给我指明了正确的方向。