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 :

unwrap à l'aide d'un certificat


Sujet :

Sécurité Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut unwrap à l'aide d'un certificat
    Bonjour,

    Je dois emballer/déballer une clé à l'aide d'un certificat, lu dans un keystore.
    Le "wrap" (emballage) se passe super-bien, mais le "unwrap" (déballage) provoque un "Data hash wrong".
    Et ceci arrive, que j'utilise le certificat ou sa clé publique pour emballer.

    J'imagine que c'est 3 fois rien, mais ça fait 2 jours que je google dans tous les sens, et je sèche

    En PJ mon code - merci déjà à mon sauveur !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Bonjour,

    D'où viens cette Exception ? du unwrap ?
    Tu as la pile d'excecution ?
    Ca serait pas plutôt une BadPaddingException ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Bonjour Jimmy

    Oui, l'exception vient en effet du unwrap.

    J'aurais dû penser à fournir la pile
    La voici:

    Exception in thread "main" java.security.InvalidKeyException: data hash wrong
    at org.bouncycastle.jce.provider.WrapCipherSpi.engineUnwrap(Unknown Source)
    at javax.crypto.Cipher.unwrap(DashoA13*..)
    at How2Unwrap.main(How2Unwrap.java:64)


    La ligne 64 est celle du unwrap.

    J'espère que ça t'inspirera...
    Sinon, qu'as-tu pensé du source ? Ai-je fait des erreurs de codage (mauvais choix de modes, algorithmes, méthodes) ?

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Je pense que dans la méthode unwrap il faut passer l'algo de la clé et pas l'algo de wrap.
    Essai avec :

    cipherUsingCertificate.unwrap(certificateWrappedKey, CIPHER_ALGORITHM, Cipher.SECRET_KEY);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Merci du tuyau: ça semble logique, vu que l'aglo de wrap est déjà spécifié lors de l'instanciation du wrapper.
    Mais ça ne change rien: tjs la même exception au même endroit
    Je garde quand même le point.

    En PJ mon source modifié.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui je pense que j'ai trouvé, tu unwrap avec la clé publique RSA. Comme c'est un algorithme asymétrique, cela ne fonctionne pas.
    Le principe est d'utiliser la clé privée pour décrypter en RSA.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Cool !

    Mon pb, c'est que Certificate ne propose que getPublicKey, pas getPrivateKey.
    Mon idée est donc d'utiliser Certificate.getEncoded().
    Le hic, c'est que cette méthode renvoie un byte[], et que je n'ai pas encore trouvé de méthode construisant une Key à l'aide de byte[] - et pourtant je cherche, environ 5 Google à la minute .

    Suis-je sur la bonne piste ?
    Ou alors dois-je plutôt choisir un autre algo que RSA ?
    D'autres indices ?

    Sinon, j'ai vu qu'on peut aussi générer une paire de clés publique/privée, mais ça ne colle pas à mon besoin, car la clé privée doit être identique lors de la génération du fichier crypté+emballage de la clé publique, et lors du décryptage du fichier reçu.
    D'où l'utilisation de la clé du certificat, identique sur la machine émettrice comme sur la machine destinataire.

    Merci

  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
    Citation Envoyé par Jimmy_ Voir le message
    Oui je pense que j'ai trouvé, tu unwrap avec la clé publique RSA. Comme c'est un algorithme asymétrique, cela ne fonctionne pas.
    Le principe est d'utiliser la clé privée pour décrypter en RSA.
    Déchiffrer, c'est mieux.

    Citation Envoyé par alexag Voir le message
    Suis-je sur la bonne piste ?
    Non.

    Citation Envoyé par alexag Voir le message
    Ou alors dois-je plutôt choisir un autre algo que RSA ?
    Ça dépend ce que tu cherches à faire, avec qui tu veux communiquer et comment. Je comprends pas où tu veux en venir et je croyais que c'était un exercice donné par un prof. Ceci dit c'est quoi cette histoire de Wrapper. Ca correspond à quoi ? A quelle norme ? Tu cherches à écrire ton implémentation de TLS ? Comprends pas !

    Citation Envoyé par alexag Voir le message
    Sinon, j'ai vu qu'on peut aussi générer une paire de clés publique/privée, mais ça ne colle pas à mon besoin, car la clé privée doit être identique lors de la génération du fichier crypté+emballage de la clé publique, et lors du décryptage du fichier reçu.
    D'où l'utilisation de la clé du certificat, identique sur la machine émettrice comme sur la machine destinataire.
    Quand tu veux communiquer avec quelqu'un de manière chiffrée :

    1/ Tu génères une clef de session (algo symétrique, AES256 par exemple).
    2/ Tu chiffres ton message avec.
    3/ Tu chiffres la clef de session avec la clef publique du certificat du destinataire.
    4/ Tu enveloppes les 2 blocs de données chiffrés. Selon le type de flux utilisé le format est différent. C'est pas pareil par mail que par FTP ou par TLS.
    5/ Tu envoies le tout à ton destinataire.
    6/ Il déchiffre la clef de session avec sa clef privée.
    7/ Il déchiffre ton message avec la clef de session.

    Donc au final, pour faire ton test, tu dois avoir de le magasin duquel tu sors la clef publique du marchand la clef privée correspondante. Si tel n'est pas le cas, tu cherches à faire quelque chose qui est impossible !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut Et lux fit !
    Ok, merci, je crois avoir pigé.

    Je n'aurais en fait PAS tous les éléments nécessaires: on ne m'a filé (dans le certificat) que la clé publique, qui me permet de chiffrer, mais pas la clé privée, sans laquelle je ne peux pas déchiffrer.

    J'ai bon ?

  10. #10
    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
    Citation Envoyé par alexag Voir le message
    Ok, merci, je crois avoir pigé.

    Je n'aurais en fait PAS tous les éléments nécessaires: on ne m'a filé (dans le certificat) que la clé publique, qui me permet de chiffrer, mais pas la clé privée, sans laquelle je ne peux pas déchiffrer.

    J'ai bon ?
    Oui.

    Pour vérifier que le chiffrement est correct il faut voir ça avec le destinataire. Tu ne peux pas faire ça tout seul sauf à générer toi même par programmation un certificat et sa paire de clef.

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui c'est normal, si c'est toi qui emet le certificat tu ne donnes que la clé publique. Ainsi les gens à qui tu parles sont certain que c'est toi et peuvent te crypter des messages.
    Il faut que tu disposes d'une clé privée pour pouvoir lire ensuite les messages.
    Cette clé ne transite jamais et reste dans un endroit sûr chez toi.
    La même chose pour le partenaire qui est connecté chez toi.
    C'est le principe de base de la norme X.509

    Il est toujours possible de parler via uniquement des clés privées. Mais il faut alors disposer d'un canal sûr pour transmettre la clé.

    Pour ton programme, génère une clé RSA toi même et fabrique ton propre certificat. Cela te permettra de tester le principe.

    info ici : http://download.oracle.com/javase/1....2/keytool.html

    bon courage,


    Déchiffrer, c'est mieux.
    Punaise, ils sont donc partout ......


    Le hic, c'est que cette méthode renvoie un byte[], et que je n'ai pas encore trouvé de méthode construisant une Key à l'aide de byte[]
    byte[] raw = "bonjourmadamedus".getBytes();
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

    Comme ça ?

  12. #12
    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
    Citation Envoyé par Jimmy_ Voir le message
    Oui c'est normal, si c'est toi qui emet le certificat tu ne donnes que la clé publique. Ainsi les gens à qui tu parles sont certain que c'est toi et peuvent te crypter des messages.
    Grrrrrrr ...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Un grand merci à tous pour vos éclairages, et une bonne année 2011 !

    Au plaisir...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/06/2015, 14h13
  2. Réponses: 1
    Dernier message: 12/02/2015, 16h09
  3. Réponses: 0
    Dernier message: 09/10/2009, 12h19
  4. Sauvegarde des certificats sur Serveur 2003 à l'aide d'un script .bat
    Par brazilia28 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 17/11/2008, 09h57
  5. Aide sur les certificats et modèles
    Par Aurélien78 dans le forum InfoPath
    Réponses: 20
    Dernier message: 15/01/2008, 14h40

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