RSA-Verschlüsselung in .NET - Entschlüsselung in JAVA -> Java wirft „Modul nicht positiv“ Fehler

StackOverflow https://stackoverflow.com/questions/3970684

Frage

Ich habe Probleme mit unseren Drittanbieter eine sso implimenting. Sie erhalten die folgende Fehlermeldung, wenn meine Unterschrift zu überprüfen:

java.lang.ArithmeticException: BigInteger: Modul nicht positiv - bei java.math.BigInteger.modPow (BigInteger.java:1556)

habe ich keine Kontrolle über ihren Java-Code. Hier ist, was ich tue jetzt:

Ich habe ein Schlüsselpaar in C # mit diesem 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));
        }

Hier ist der Code für die Signatur:

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);
    }

(Ja, ich weiß, dass der private Schlüssel sollte in einem Schlüsselspeicher sein).

Hier ist der Code, den sie zu xml Schlüssel convert verwenden (das ist 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;
}
War es hilfreich?

Lösung

Die Ausnahme hat mit dem öffentlichen RSA-Schlüssel zu tun, dass Java verwendet. Keine Ihrer Code-Adressen an, Punkt. Wie hat dich die Java-Seite, dass die Schlüssel erhalten, welches Format verwendet wird?

Ein häufiger Fehler, die für den Fehler erklären können, wenn das Modul in ein Array von Bytes umgewandelt wird und ein führender Null-Byte ist nicht vorhanden, wenn es sein muss. Grundsätzlich rel="nofollow"> ist ein wenig schwieriger zu verwenden als es zunächst erscheinen mag. Es ist für die Kompatibilität mit DER-kodierten ASN.1 ganzen Zahlen entworfen. Das Ergebnis von all dem ist, dass, wenn das erste Byte b Ihres Moduls den hohen Bit gesetzt hat, das heißt 128 <= b < 256 Sie eine führende Null-Byte oder Ihr Modul als negative Zahl interpretiert werden muss vorangestellt. Der Einfachheit halber können Sie immer eine führende Null-Byte vorangestellt; kein Schaden kommt, wenn es nicht notwendig ist.

scroll top