IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Java Discussion :

[SHA1WithRSA, MD5WithRSA - BouncyCastle]


Sujet :

Sécurité Java

  1. #1
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut [SHA1WithRSA, MD5WithRSA - BouncyCastle]
    [Je suis sous plateforme WinXPPro, avec Java6 à jour et la dernière version de Bouncycastle. J'ai installé le Policy machin bidule.]

    Dans le cadre de la manipulation de certificats X.509 je cherche à effectuer moi-même manuellement certaines comparaisons et notamment la comparaison du hash du certificat.

    Je calcule moi même le hash du certificat à partir d'un tableau de byte extrait via MonCertificat.getEncoded().
    Mon hash est toujours correct puisque lorsque je le compare avec la valeur donnée par le magasin windows ou celui de Thunderbird où j'ai les mêmes certificats ça colle pile/poil.

    Donc ça c'est ok.

    Maintenant lorsque je veux m'occuper de la signature du certificat elle même, là ça coince.
    J'extrais la signature via MonCertificat.getSignature() puis je veux déchiffrer cette valeur via l'algorithme RSA pour obtenir le hash et le comparer à celui que j'ai calculé.

    Ya pas moyen de déchiffrer sans lever une exception, même avec BouncyCastle.
    Avec les providers installés de base, je me retrouve avec une BadPaddingException.
    Avec BouncyCastle je me retrouve avec une DataLenghtException.

    A noter que j'ai ces exception uniquement lorsque la valeur chiffrée de la signature est supérieure à 128bits.
    Or sur le wiki de bouncycastle il est indiqué dans la FAQ (point n° 5) que le chiffrement RSA "will not process more than 127 bytes of data"... Ce qui me parait hallucinant, la FAQ date de 2002, peut être n'est-elle plus trop à jour

    En d'autres termes, le déchiffrement ne plante pas avec de vieux certificats (longueur hash chiffré <= 128 bits), mais par contre les valeurs retournées sont incohérentes...

    J'ai aussi un problème de fonctionnement de la méthode verify() de X509Certificate qui me lève une exception avec des certificats récents (alors que ceux-ci sont correct) et pas avec mon certificat ayant un hash chiffré de 128bits.

    Donc voilà, je cale, je plante, j'arrive pas à comprendre où je déconne.

    Je poste ici le code de déchiffrement du hash, à mettre dans une méthode de classe ou dans un static void main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    Security.addProvider(new BouncyCastleProvider());
     
    String sNomX509 = "certificat1.globalsign.cer";
     
    X509Certificate cert = null;
     
    try{
     
    			//
    			// Chargement du Certificat X.509 ...
    			//
    			InputStream inStream = new FileInputStream(sNomX509);
    			CertificateFactory cf = CertificateFactory.getInstance("X.509");
    			cert = (X509Certificate)cf.generateCertificate(inStream);
    			inStream.close();
     
    			//System.out.println(cert.toString());
     
    		}
    		catch(FileNotFoundException fnfe){
    			System.out.println("Le fichier " + sNomX509 + " n'a pas été trouvé.");
    			fnfe.printStackTrace();
    		}
    		catch(CertificateException ce){
    			System.out.println("Problème avec le certificat. Probablement une erreur d'encodage du fichier.");
    			ce.printStackTrace();
    		}
    		catch(IOException ioe){
    			System.out.println("Erreur d'entrée/sortie.");
    			ioe.printStackTrace();
    		}
    		catch(Exception e){
    			System.out.println("Exception générique.");
    			e.printStackTrace();
    		}
     
    //
    		//	Déchiffrement de la valeur de signature du certificat
    		//
     
    		try{
     
    			/*
    			 * Note : Le hash a été chiffré avec la clef privée du possesseur du certificat.
    			 * Il faut utiliser sa clef publique pour déchiffrer.
    			 */
     
    			byte[] byTabHashValue = null;
     
    			System.out.println("Algorithme de signature du certificat : " + cert.getSigAlgName());
    			byTabHashValue = cert.getSignature();
    			System.out.println(byTabHashValue.length);
    			System.out.println("Valeur de signature du certif : " + Conversion.bytesToHexString(byTabHashValue));
    			PublicKey pkPublicKey = cert.getPublicKey();
     
    			// déchiffrement de la valeur
    			Cipher cipher = Cipher.getInstance("RSA", "BC");
    			cipher.init(Cipher.DECRYPT_MODE, pkPublicKey);
    			byte[] byHashDecoded = cipher.doFinal(byTabHashValue);
    			System.out.println("Valeur de signature du certif déchiffrée : " + Conversion.bytesToHexString(byHashDecoded));
     
    		}
    		catch(NoSuchProviderException nsprvoe){
    			System.out.println("Provider inconnu.");
    			nsprvoe.printStackTrace();
    		}
    		catch(NoSuchAlgorithmException nsae){
    			System.out.println("Algorithme " + Checksum.SHA1 + " inconnu des providers enregistrés !");
    			nsae.printStackTrace();
    		}
    		catch(NoSuchPaddingException nspe){
    			System.out.println("Pas de padding.");
    			nspe.printStackTrace();
    		}
    		catch(InvalidKeyException ike){
    			System.out.println("Clef invalide !");
    			ike.printStackTrace();
    		}
    		catch(BadPaddingException bpe){
    			System.out.println("Mauvais padding !");
    			bpe.printStackTrace();
    		}
    		catch(IllegalBlockSizeException ibse){
    			System.out.println("Taille de bloc illégale !");
    			ibse.printStackTrace();
    		}
    EDIT : La méthode bytesToHexString() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    /**
             * Le tableau de byte p_TabBytes passé en paramètre est retourné sous forme de chaine
             * en représentation Hexadécimale.  
             * 
             * @param p_TabBytes
             * @return String La représentation hexadécimale de p_TabBytes
             */
    	public static String bytesToHexString(byte[] p_TabBytes) {
     
    		StringBuffer output = new StringBuffer("");
     
    	    if (p_TabBytes != null) {
    	      for (int i = 0; i < p_TabBytes.length; i++) {
    	        short intern = (short) (p_TabBytes[i] & (short) 0x00FF);
    	        output.append(leftZeroPad(Integer.toHexString(intern), 2));
    	      }
    	    }
     
    	    return output.toString().toUpperCase();
     
    	}
     
    /**
               * add "0" to the left of the input string until length equals digitNumber value
               * @param String input
               * @param int digitNumber final number of digit
               */
    	  private static String leftZeroPad(String input, int digitNumber) {
    	    String out = "";
     
    	    if (input != null) {
    	      out = input;
    	    }
     
    	    if (digitNumber > out.length()) {
    	      while (out.length() < digitNumber)
    	        out = "0" + out;
    	    }
     
    	    return out.toUpperCase();
    	  }

  2. #2
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Je me rends compte que j'avais pas cloturé ce message.

    La solution à mon problème est ici :

    http://www.developpez.net/forums/d71...te-certificat/

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Par défaut
    Bonjour à tous et merci pour votre aide futur

    voila je débute dans l'utilisation des Certificat et la j'ai un blocage au niveau de la vérification de la signature d'un certificat. Vous avez dit:
    J'extrais la signature via MonCertificat.getSignature() puis je veux déchiffrer cette valeur via l'algorithme RSA pour obtenir le hash et le comparer à celui que j'ai calculé.
    Donc, je suis trés reconnaissant, si vous pouvez nous envoyer le code que vous avez exécuté pour l'extraction et la verification de la signature.

    Merci d'avance pour votre aide .

  4. #4
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Il faut lire jusqu'au bout. Je peux pas te répondre ce serait t'insulter ...

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Par défaut
    Salut,

    Non, biensur j'ai lu tout, mais j'ai besoin seulement de cette partie.

    Et merci dans tous les cas.

  6. #6
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Je me rends compte que j'avais pas cloturé ce message.

    La solution à mon problème est ici :

    http://www.developpez.net/forums/d71...te-certificat/
    Je peux pas dire mieux.

    La fonction .verify() fais bien le boulot. Ça ne sert à rien de vouloir faire ça manuellement. Peut être que je me trompe mais dans ce cas je voudrais bien qu'on me dise pourquoi :p

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Par défaut
    Bonjour,

    Je suis pas en train de faire une simple vérification mais c'est le sujet de mon PFE. Il s'agit de vérifier la validité d'un certificat concernant tous ( la date, CRL et l'intégrité). Et je dois faire un code java qui fait tous.
    Note: J'ai lu la discussion que tu m'a indiqué, mais je trouve pas mon besoin.

    Merci bien et c'est pas la peine.

  8. #8
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Et ben pour la date tu as checkValidity() et checkValidity(Date date).

    Pour la CRL je suis pas encore dessus mais ya pas mal de topics qui en parlent, ça doit pas être bien sorcier (regarder du côté des classes avec CRL dans le nom :p)

    Pour l'intégrité si au chargement de ton certificat tu prends une CertificateParsingException et ben c'est que le certificat n'est pas au format DER.
    Ou alors on parle pas de la même chose concernant l'intégrité.

    C'est quoi un PFE ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Par défaut
    C'est le Projet de Fin d'Etude.

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Bonjour,

    J'ai lu le bou de code qui permet de déchiffrer la signature d'un certificat et il peut m'aider.
    Mais si vous pouvez me dire qu'elle est l'utilité de la fonction: bytesToHexString()?
    Car j'ai pas compris qu'est ce qu'elle fait exactement.
    Alors, je l'ai ignoré cette fonction et je la remplace par la boucle for suivante, et j'ai obtenu un affichage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<byTabHashValue.length;i++)
    { 
        System.out.print(byTabHashValue[i]);
    }
    Et pour le bloc de déchiffrement il m'a donner l'erreur
    cannot resolve symbol class Cipher
    J'ai fait alors l'importation:
    Encore, il m'a donné:
    cannot resolve symbol cass crypto
    Je suis trés reconnaissant si vous me repondre le plus tot possible car je suis un peu pressé par le temps.
    Merci beaucoup pour vous.

  11. #11
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Je n'ai pas la réponse à ton problème puisque moi je passe par la fonction verify(), je ne me prends pas la tête à faire ça manuellement. Je ne comprends pas pourquoi tu t'entêtes ...

    bytesToHexString() converti les octets en hexadécimal pour afficher dans la console. C'est juste pour afficher ça n'a aucun intérêt dans l'algorithme de déchiffrement (que je n'ai jamais fait marché d'ailleurs.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BouncyCastle] vérifier signature détachée
    Par amr_at_work dans le forum Sécurité
    Réponses: 4
    Dernier message: 04/06/2008, 10h02
  2. Bouncycastle / pkcs7 / TimestampToken]
    Par fastteam dans le forum Sécurité
    Réponses: 2
    Dernier message: 16/08/2007, 17h24
  3. [BouncyCastle] pb d'import
    Par pitit777 dans le forum Sécurité
    Réponses: 1
    Dernier message: 04/04/2007, 16h08
  4. [bouncycastle][signature][jeton]
    Par Le Marlou dans le forum Sécurité
    Réponses: 1
    Dernier message: 24/03/2006, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo