Unterschrift.verify() Immer False zurück
public static void main(String[] args) {
try{
String mod = "q0AwozeUj0VVkoksDQSCTj3QEgODomq4sAr02xMyIrWldZrNHhWfZAIcWt2MuAY3X6S3ZVUfOFXOrVbltRrO3F9Z6R8/jJIMv7wjkeVBFC5gncwGR0C3aV9gmF6II19jTKfF1sxb26iMEMAlMEOSnAAceNaJH91zBoaW7ZIh+qk=";
String exp = "AQAB";
byte[] modulusBytes = Base64.decodeBase64(mod.getBytes("UTF-8"));
byte[] exponentBytes = Base64.decodeBase64(exp.getBytes("UTF-8"));
String signedMessage = "3753e672cfb21e3c182ef2df51f19edeffb63432ed338a47251326ccc14aa63883e910a140cf313754ebc6425aad434e309307cc882da6cd4a4f9f40bd14a9823aca145e5ffc97cd63dbb5925c049282416bdfd7d74ddeef7055065210a841793fe315dff5a44af19c1522daafdc2f7e61ce5a2b42ebf79dfb086e6d210168dd";
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);
Signature signature = Signature.getInstance("SHA1withRSA");
byte[] sigBytes = hexStringToByteArray(signedMessage);
signature.initVerify(pubKey);
System.out.println(signature.verify(sigBytes));
}catch(Exception e){
System.out.println("Error: " + e.toString());
}
}
private static byte[] hexStringToByteArray(final String encoded) {
if ((encoded.length() % 2) != 0)
throw new IllegalArgumentException("Input string must contain an even number of characters");
final byte result[] = new byte[encoded.length()/2];
final char enc[] = encoded.toCharArray();
for (int i = 0; i < enc.length; i += 2) {
StringBuilder curr = new StringBuilder(2);
curr.append(enc[i]).append(enc[i + 1]);
result[i/2] = (byte) Integer.parseInt(curr.toString(), 16);
}
return result;
}
Dieser code immer false zurück. Ich bin mir nicht sicher, wohin Sie gehen von hier aus.
Sie überprüfen vor nichts. Es würde nur true zurückgeben, wenn die Signatur wird auch generiert, für leere Daten.
Ich dachte, ich überprüfen Sie es gegen die sigBytes. Weißt du, wie ich dieses Problem beheben?
Ich dachte, ich überprüfen Sie es gegen die sigBytes. Weißt du, wie ich dieses Problem beheben?
InformationsquelleAutor Jimmy | 2010-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo Sie die Nachricht signieren, sollten Sie einige code wie dieser:
Beachten Sie die byte-array mit dem Namen
signatureValue
. Das ist die eigentliche Signatur der Daten. Das ist das, was Sie sollten dieverify()
-Methode. Die Nachricht, die unterschrieben werden sollte, einen Aufruf an dieupdate()
-Methode. I. e.:InformationsquelleAutor Rasmus Faber
Ich denke, das problem ist, dass Sie nicht tatsächlich gibt es eine Nachricht, um zu überprüfen.
Einer RSA-Signatur funktioniert durch die erste hashing der Nachricht (das ist das "SHA1" in "SHA1withRSA"), und dann durchführen einer trapdoor-Betrieb. Dies ist eine operation, die ist einfach zu tun, in die eine Richtung und hart in die andere Richtung, es sei denn, Sie wissen, einige geheime Informationen (der private RSA-Schlüssel).
Überprüfen Sie zuerst invertieren der mathematischen transformation (weil es leicht in einer Richtung), und vergleicht dann den hash, der eingebettet ist in die Signatur mit dem hash-Wert der Nachricht, die Sie gerade berechnet. Die Signatur, nicht in sich selbst enthalten die Nachricht, um zu überprüfen, die eine Signatur benötigen Sie sowohl die Signatur und der Nachricht, die signiert wurde.
In einem API Ebene sieht es so aus das
Signature
- Klasse erwartet Sie nennenupdate
mit dem Inhalt der Nachricht, die diese Signatur war. Ohne diese, ist es wahrscheinlich, vergleicht den hash mit dem hash-Wert ein leerer string, wenn nicht die ursprünglich signierten Nachricht war auch eine leere Zeichenfolge, die Signatur ist in der Tat nicht gültig.Richtig - Sie geben die Daten, die Sie signiert, um die Signatur der Klasse via update. Du bist nicht wirklich überprüfen der Signatur gegen etwas (was implizit bedeutet, dass Sie überprüfen Sie es gegen die leere Zeichenfolge, nicht gegen das, was Sie unterzeichnet).
InformationsquelleAutor Jack Lloyd
Du hattest Recht, danke Jack. Die unter-Methode funktioniert perfekt (sogar mit ein Schlüssel erstellt werden soll .NET)! Ich hoffe, das hilft anderen.
InformationsquelleAutor Jimmy