Ich muss die aus C# erstellte Signatur mithilfe des "SHA1" -Algorithmus in meinem JAVA-Programm überprüfen, das "SHA1withRSA" verwendet. Signaturbytes stimmen nicht überein. Ich verwende den öffentlichen Schlüssel, der vom C# -Programm erzeugt wurde, um die Signatur zu überprüfen, die in einer Datei gespeichert ist. Ich bin neu in der Kryptographie. Im Folgenden finden Sie Code C# erstellen Unterschrift:Die in C# erstellte digitale Signatur stimmt nicht mit der Java-Verifizierung überein.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(privateKey);
var encoder = new UTF8Encoding();
byte[] originalData = encoder.GetBytes(message);
SHA1 sha1 = SHA1.Create();
byte[] signedBytes = RSA.SignData(originalData, sha1);
return signedBytes;
Ich versuche, wie unten Signatur in Java-Programm zu überprüfen:
//read xml file to get modulus and exponent bytes
File publicKeyFileQA = new File(PUBLIC_KEY_FILE_QA);
Map<String, BigInteger> publicKeyModulusExponentValues = DSXCRM_3YBP_Global_WebServicesUtil.readXMLFile(publicKeyFileQA);
BigInteger publicKeyModulus = publicKeyModulusExponentValues.get("modulus");
BigInteger publicKeyExponent = publicKeyModulusExponentValues.get("exponent");
System.out.println("BigInteger Modulus : "+ publicKeyModulus + "BigInteger Exponent : " + publicKeyExponent);
String messageWithSignature = (String) mapDataToPost.get("SignedMessage");
String encryptedMessage = (String) mapDataToPost.get("EncryptedMessage");
byte[] signatureBytes = DatatypeConverter.parseBase64Binary(messageWithSignature);
System.out.println("Signature bytes : "+ new String(signatureBytes));
byte[] cipherMessage = DatatypeConverter.parseBase64Binary(encryptedMessage);
System.out.println("Cipher Message : "+ new String(cipherMessage));
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(publicKeyModulus, publicKeyExponent);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(publicKey); //public key of sender
sig.update(cipherMessage);
boolean isRightSender = sig.verify(signatureBytes);
System.out.println("isRightSender : "+isRightSender);
aber Ergebnis übereinstimmen Signatur falsch ist. Ich verstehe nicht, was falsch ist. Kannst du bitte irgendwelche Vorschläge machen? Gibt es einen anderen Algorithmus, der sowohl mit C# als auch mit JAVA kompatibel ist, um dieselben Signaturen zu haben? Vielen Dank!
Ich sehe keine offensichtlichen Fehler in Ihrem Code. Kann die Codierung der Nachrichten- und Signaturbytes sein, die von C# an Java gesendet werden? – pedrofb
ja, ich stimme dir zu. Es könnte ein Codierungsfehler sein, dem ich gegenüberstehe. – Coder