[Java - cryptographie] Problème de vérification de signature

Problème de vérification de signature [Java - cryptographie] - Java - Programmation

Marsh Posté le 30-03-2007 à 12:09:15    

Bon voilà, je n'arrive à vérifier une signature. Le programme affiche toujours "false", pourquoi ? ... bien qu'ayant parcouru un peu tout (livre, google, forum), j'ai du rater une étape  [:amandine75011] laquelle ?
 

Code :
  1. package sign;
  2. import java.io.DataInputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.security.KeyStore;
  6. import java.security.PrivateKey;
  7. import java.security.Provider;
  8. import java.security.Security;
  9. import java.security.Signature;
  10. import java.security.cert.Certificate;
  11. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  12. public class SignTest {
  13. private static byte[] sign(byte[] dataToSign) {
  14.  File certificat = new File("d:\\txt\\gadmin.p12" );
  15.  String password = "gadmin";
  16.  // provider cryptographic algorithm implementation
  17.  Security.addProvider(new BouncyCastleProvider());
  18.  Provider provBC = Security.getProvider("BC" );
  19.  try {
  20.   KeyStore keyStore = KeyStore.getInstance("PKCS12" );
  21.   keyStore.load(new FileInputStream(certificat), password
  22.     .toCharArray());
  23.   PrivateKey privatekey = (PrivateKey) keyStore.getKey(
  24.     (String) keyStore.aliases().nextElement(), password
  25.       .toCharArray());
  26.   Signature sigInst = Signature.getInstance("MD5withRSA", provBC);
  27.   sigInst.initSign(privatekey);
  28.   sigInst.update(dataToSign);
  29.   return sigInst.sign();
  30.  } catch (Exception e) {
  31.   e.printStackTrace();
  32.  }
  33.  return null;
  34. }
  35. private static boolean verify(byte[] sigToVerify) {
  36.  File certificat = new File("d:\\txt\\gadmin.p12" );
  37.  String password = "gadmin";
  38.  // provider cryptographic algorithm implementation
  39.  Security.addProvider(new BouncyCastleProvider());
  40.  Provider provBC = Security.getProvider("BC" );
  41.  try {
  42.   KeyStore keyStore = KeyStore.getInstance("PKCS12" );
  43.   keyStore.load(new FileInputStream(certificat), password
  44.     .toCharArray());
  45.   Certificate cert = keyStore.getCertificate((String) keyStore
  46.     .aliases().nextElement());
  47.   Signature sigInst = Signature.getInstance("MD5withRSA", provBC);
  48.   sigInst.initVerify(cert.getPublicKey());
  49.   sigInst.update(sigToVerify);
  50.   return sigInst.verify(sigToVerify);
  51.  } catch (Exception e) {
  52.   e.printStackTrace();
  53.  }
  54.  return false;
  55. }
  56. public static void main(String args[]) {
  57.  // load zip file to sign
  58.  File inputZipDataFile = new File("d:\\test.zip" );
  59.  byte[] dataToSign = new byte[(int) inputZipDataFile.length()];
  60.  DataInputStream in;
  61.  try {
  62.   in = new DataInputStream(new FileInputStream(inputZipDataFile));
  63.   in.readFully(dataToSign);
  64.   in.close();
  65.  } catch (Exception e) {
  66.   // TODO Auto-generated catch block
  67.   e.printStackTrace();
  68.  }
  69.  byte[] signature = sign(dataToSign);
  70.  boolean verification = verify(signature);
  71.  System.out.println(verification);
  72. }
  73. }



---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 30-03-2007 à 12:09:15   

Reply

Marsh Posté le 13-04-2010 à 12:20:28    

Je sais que le message date, tu as surement trouvé la solution depuis. En tout cas si quelqu'un d'autre tombe sur ton post, voilà la solution :
 
Dans la méthode verify ce qu'il faut passer en paramètre à la méthode "update()" c'est pas la signature mais les données signées. Ainsi on vérifie que les données signées correspondent bien à la signature.
 

Code :
  1. private static boolean verify(byte[] dataSigned, byte[] sigToVerify) {
  2.  File certificat = new File("d:\\txt\\gadmin.p12" );
  3.  String password = "gadmin";
  4.  // provider cryptographic algorithm implementation
  5.  Security.addProvider(new BouncyCastleProvider());
  6.  Provider provBC = Security.getProvider("BC" );
  7.  try {
  8.   KeyStore keyStore = KeyStore.getInstance("PKCS12" );
  9.   keyStore.load(new FileInputStream(certificat), password
  10.     .toCharArray());
  11.   Certificate cert = keyStore.getCertificate((String) keyStore
  12.     .aliases().nextElement());
  13.   Signature sigInst = Signature.getInstance("MD5withRSA", provBC);
  14.   sigInst.initVerify(cert.getPublicKey());
  15.   sigInst.update(dataSigned);
  16.   return sigInst.verify(sigToVerify);
  17.  } catch (Exception e) {
  18.   e.printStackTrace();
  19.  }
  20.  return false;
  21. }


Message édité par gzaviou le 13-04-2010 à 12:21:09
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed