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

Java Discussion :

problème bouncycastle(java) et openssl(c)


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut problème bouncycastle(java) et openssl(c)
    Salut,

    je développe une application permettant de communiquer de manière sécurisée entre un serveur java et un client mobile (iphone). Pour cela j'utilise le JCE bouncycastle pour java et openssl pour iPhone.

    Cependant, j'ai un problème : je chiffre mon message avec RSA sous java mais quand je le déchiffre sous openssl, le message est différent de celui d'origine.

    Mon serveur fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //coté serveur langage JAVA
     
     
    //récuperation de la clé publique client
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus,exposant);
    KeyFactory fact = KeyFactory.getInstance("RSA");
    Key publicKey = fact.generatePublic(keySpec);
     
    //chiffrement du message
    Cipher cipher = Cipher.getInstance("RSA/None/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE,publicKey);
    String message = "hello world";
    byte[] messageCrypte = cipher.doFinal(message.getBytes());

    Le client quant à lui déchiffre comme cela :
    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
     
    //Coté client langage C
     
    RSA * rsa;
    const char *encrypt,*decrypt;
     
    //generation de la paire de clés RSA
    rsa = RSA_generate_key(1024,65537,NULL,NULL);
     
    /*
    récuperation du message du serveur
    grace à un web-service
    */
     
    //dechiffrement du message
    encrypt = (char*)malloc(RSA_size(rsa));
    decrypt = (char*)malloc(RSA_size(rsa));
    int error = RSA_private_decrypt(RSA_size(rsa),(unsigned char *)encrypt,(unsigned char *)decrypt,rsa,RSA_NO_PADDING);
    Je n'ai pas d'erreurs, cependant, le message déchiffré ne correspond pas au message d'origine.

    Ai-je oublié quelque chose ?

  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
    Comme ça, heu vérifie bien que ton serveur chiffre bien avec la clé publique.
    Et que tu n'as pas inversé et que tu chiffres pas avec la clé privé.

    Ensuite après il faudra mettre un mode opératoire, CBC ou autre, et du padding. Ca sera plus sûr.

    Sinon juste une question, pourquoi tu utilises un algo asymétrique ?

  3. #3
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    merci pour ta réponse rapide.

    J'ai vérifié et le serveur chiffre bien avec la clé publique et non la clé privée.

    Pour le padding, j'en ai essayé plusieurs : PKCS1, OAEP, SSL23, etc mais ca me fait toujours le même problème. Donc là je le faisais sans le padding pour identifier la cause du problème.

    Sinon, pour l'algo asymétrique, je prévoyais d'utiliser une clé partagée avec l'algo AES, mais pour être sécurisé, j'ai besoin de transférer la clé AES de manière chiffrée avec RSA justement.

  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
    Dans ce cas , c'est un soucis de transmission de ta clé publique, trace ce que tu envoies et ce que tu reçois.

  5. #5
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    alors j'ai regardé avec Wireshark ce que je recevais coté serveur, et les données (modulus et exposant) sont bien celles que le client à envoyé.

  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
    Ok,

    Tu peux donner un exemple de valeurs chiffrées que tu envoies et le résultat que tu attends , je vais essayer de le faire de mon coté pour voir.

    En principe pour une clé de 1024 bits, si ton exposant publique est 65537, ça fait encore un modulo assez volumineux. Il y a peut-être un soucis de ce coté là.

  7. #7
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    pour la valeur chiffrée c'est sous java et ca donne : [B@7291b9b0

    et le message qui devrais apparaitre une fois déchiffré sous iPhone est : bonjour olivier

  8. #8
    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
    [B@7291b9b0
    Bizarre ça ressemble à une référence sur un objet. Tu chiffrerais pas la référence ou lieu de la valeur de l'objet par hasard ?

    Tu as le code de cette portion quand tu chiffres ?

  9. #9
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    ben le code pour le chiffrement, c'est celui là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Cipher cipher = Cipher.getInstance("RSA/None/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE,publicKey);
    String message = "hello world";
    byte[] messageCrypte = cipher.doFinal(message.getBytes());
    return messageCrypté.toString();

  10. #10
    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 ça, le .toString d'un byte[] te donne la référence et pas l'objet.

    Si tu veux le mettre dans un String il te faut faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String(messageCrypté)

    Piégé par le toString java

  11. #11
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    Je sais pas trop ce qui ce passe là mais maintenant, j'ai une SOAP fault quand j'envoie le message chiffré. Pourtant je ne fais rien de spécial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String str = new String(messageCrypté,"UTF-8");
    return str;
    et là, ca passe pas j'ai une erreur qui dit : Invalid white space character (0xc) in text to output.

    Ma conversion en String est-elle mal faite ?

  12. #12
    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
    Non ça va pour le String, mais tu ne peux pas transmettre le message codé en bytes ou en String comme ça directement. Il te faut une représentation de ton message qui passe dans ton webservice.

    Je ne suis pas un spécialiste en webservice, mais il me semble qu'il faut encoder la chaine pour que les caractères spéciaux ne pose pas de soucis.

  13. #13
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    ok merci, j'essaye avec l'encodage base64.

  14. #14
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    alors j'encode en base64 sur le serveur (java) et quand je decode sur mon client(c) le message crypté ne correspond pas au message envoyé par le serveur avant l'encodage base64.

    pourtant l'encodage base64 fonctionne car si j'envoie un message non crypté, mais juste encodé base64, il se décode trés bien coté client.

    Quel pourrait être le problème ?

  15. #15
    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
    Aucune raison que ça ne marche pas.

    Tu envoies toujours le .toString() d'un type primitif ou tu as changé ton code ?

  16. #16
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    non j'envoie cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    byte[] messageCrypte = cipher.doFinal(message.getBytes());
    String message = Base64.encodeBytes(messageCrypte);
    return message;
    et quand je ne chiffre pas le message avec RSA, l'encodage et décodage base64 fonctionne bien des 2 cotés.

  17. #17
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    bon, je viens de faire un test : j'ai generé mes clés RSA avec openssl et j'ai chiffré le message "bonjour olivier" coté client (c).

    j'ai ensuite pris la clé publique, chiffré le même message avec cette clé publique RSA mais avec bouncyCastle coté serveur (java).

    Normalement les deux messages chiffrés devraient être identiques mais, ils ne le sont pas, pourtant la clé de chiffrement est la même pour les deux cotés.

    même les paddings sont identiques :

    - "RSA/None/NoPadding" pour JAVA et

    - "RSA_NO_PADDING" pour c

    Openssl ne peut-il pas déchiffrer les messages chiffrés par bouncycastle ?

  18. #18
    Membre averti
    Homme Profil pro
    ingénieur d'études
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Par défaut
    C'est bon, j'ai trouvé le problème : Openssl n'accepte pas le NO_PADDING.

    En fait il faut mettre "RSA/ECB/PKCS1Padding" en JAVA, et
    "RSA_PKCS1_PADDING" en C.

    Cependant, de temps en temps, le décryptage (C) fait une erreur. D'où cela peut-il venir ?

  19. #19
    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,

    Il y a plusieurs versions de ce padding, peut-être que les deux ne sont pas sur la même.

    Sinon essai d'autres padding comme le PKCS7, je n'ai jamais eu de soucis avec celui là.

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

Discussions similaires

  1. Problème HASHTABLES java
    Par ldcarpathes dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 17/08/2006, 17h25
  2. Problème de java.lang.NoClassDefFoundError
    Par nramariavelo dans le forum Hibernate
    Réponses: 5
    Dernier message: 13/06/2006, 14h54
  3. problème sous java
    Par lazzeroni dans le forum Oracle
    Réponses: 4
    Dernier message: 12/04/2006, 15h16
  4. Problème Applet Java et Win XP SP2
    Par octal dans le forum Applets
    Réponses: 4
    Dernier message: 04/02/2006, 09h57
  5. divers problème avec Java et jdbc
    Par chti_juanito dans le forum JDBC
    Réponses: 28
    Dernier message: 31/10/2005, 16h54

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