la signature.vérifier() renvoie Toujours False
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;
}
Ce code renvoie toujours false. Je ne sais pas où aller à partir d'ici.
Vous êtes à la vérification par rapport à rien. Il ne renvoie vrai si votre signature est également généré de données vide.
Je pensais que j'étais la vérification de la contre la sigBytes. Savez-vous comment je pourrais résoudre ce problème?
Je pensais que j'étais la vérification de la contre la sigBytes. Savez-vous comment je pourrais résoudre ce problème?
OriginalL'auteur Jimmy | 2010-06-30
Vous devez vous connecter pour publier un commentaire.
Où vous signez le message que vous devriez avoir un code comme ceci:
Remarque le tableau d'octets nommé
signatureValue
. Qui est le véritable signature sur les données. Qu'est ce que vous devez fournir à laverify()
-méthode. Le message est signé doit être fourni dans un appel à laupdate()
-méthode. I. e.:OriginalL'auteur Rasmus Faber
Je pense que le problème, c'est que vous n'êtes pas réellement en lui donnant un message pour vérifier.
Une signature RSA œuvres de premier hachage du message (c'est le "SHA1" dans "SHA1withRSA"), et en effectuant ensuite une trappe de l'opération. C'est une opération qui est facile à faire dans une direction et le mal dans l'autre sens, à moins de connaître des informations secrètes (la clé privée RSA).
Pour vérifier, vous devez d'abord inverser la transformation mathématique (parce que c'est facile dans un sens), et puis comparer le hash qui est incorporé dans la signature avec le hash du message que vous venez de calculé. La signature n'est pas en lui-même contient le message; pour vérifier une signature vous avez besoin de la signature et le message qui a été signé.
À un API niveau, il semble que la
Signature
classe vous attend à l'appelerupdate
avec le contenu du message que cette signature a été pour. Sans cela, c'est probablement le cas de la comparaison de la valeur de hachage avec le hash d'une chaîne vide, donc à moins que votre message a été signée à l'origine également d'une chaîne vide, la signature n'est pas valide.Droit, vous devez fournir les données que vous avez signé à la Signature de la classe via la mise à jour. Vous n'êtes pas vraiment la vérification de la signature à l'encontre de n'importe quoi (ce qui implicitement signifie que vous êtes à la vérification de la contre la chaîne vide, pas à l'encontre de ce que vous avez signé).
OriginalL'auteur Jack Lloyd
Vous avez eu raison, merci Jack. La méthode ci-dessous fonctionne parfaitement (même avec une clé créée en .NET)! J'espère que cela aide les autres.
OriginalL'auteur Jimmy