J'ai des problèmes avec notre fournisseur tiers qui implémente un sso. Ils reçoivent l'erreur suivante lors de la vérification de ma signature:Cryptage RSA dans .NET - décryptage dans JAVA -> Java lance l'erreur "module non positif"
java.lang.ArithmeticException: BigInteger: module non positif - à java.math.BigInteger.modPow (BigInteger.java:1556)
Je ne contrôle sur leur code Java. Voici ce que je fais maintenant:
J'ai créé une paire de clés en C# en utilisant ce code:
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));
}
Voici le code de la signature:
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);
}
(Oui, je sais que la la clé privée doit être dans un magasin de clés).
Voici le code qu'ils utilisent pour convertir les clés xml (ce qui est Java)
private static RSAPublicKey ReadXMLKey(String fileName)
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File(fileName));
byte[] modBytes = GetBytesFromElement(document, "Modulus");
byte[] expBytes = GetBytesFromElement(document, "Exponent");
RSAPublicKeySpec rsaKeyspec = new RSAPublicKeySpec(new BigInteger(modBytes), new BigInteger(expBytes));
RSAPublicKey key = (RSAPublicKey)KeyFactory.getInstance("RSA").generatePublic(rsaKeyspec);
return key;
}
private static byte[] GetBytesFromElement(Document doc, String tag) throws IOException
{
BASE64Decoder decoder = new BASE64Decoder();
NodeList list = doc.getElementsByTagName(tag);
byte[] results = null;
if (list.getLength() == 1)
{
Element item = (Element)list.item(0);
Text text = (Text)item.getFirstChild();
results = decoder.decodeBuffer(text.getNodeValue().trim());
}
return results;
}
Pourriez-vous publier toute la pile d'exceptions Java? – andrewmu
Malheureusement, je ne peux pas. Ils refusent de le fournir. Cela vient apparemment des classes Java RSA standard. –
J'ai supplié et j'ai obtenu leur code de conversion de clé XML. Voir ci-dessus –