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

Entrée/Sortie Java Discussion :

Envoi d'une chaine de caractères chiffrée par socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Points : 187
    Points
    187
    Par défaut Envoi d'une chaine de caractères chiffrée par socket
    Bonjour,
    J'ai un problème pour envoyer une chaine de caractères chiffrée en AES au travers d'un socket.

    Pour chiffrer/déchiffrer j'utilise la classe AES.java que j'ai trouvée ici:
    https://gist.github.com/dweymouth/11089238

    Voici ce que je fais pour chiffrer (la clé est stockée dans une instance):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String texteAChiffrer = jTextFieldMessageSaisi.getText();
     
    if(!"".equals(texteAChiffrer)) {
        InstanceCle instanceCle = InstanceCle.getInstance();
        String key = instanceCle.getKeyToEncryptDecrypt();
        ByteArrayInputStream is = new ByteArrayInputStream(texteAChiffrer.getBytes());
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        AES.encrypt(128, key.toCharArray(), is, os);
     
        String textChiffre = os.toString("UTF-8");
    }
    Le texte chiffré est ensuite envoyé par la sortir de mon Socket.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bS���N������X(�gn:/K6od`�+���b����1�u��?��b�l
    De l'autre coté, je recois le texte par l'entrée de mon Socket:
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bS???N??????X(?gn:/K6od`?+???b????1?u?????b?l
    Déjà je notes une différence avec des points d’interrogation au lieu des caractères spéciaux.

    Voici mon code pour déchiffrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    InstanceCle instanceCle = InstanceCle.getInstance();
    String key = instanceCle.getKeyToEncryptDecrypt();
    ByteArrayInputStream is = new ByteArrayInputStream(texte.getBytes());
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    AES.decrypt(key.toCharArray(), is, os);
     
    String texteEnClair = os.toString("UTF-8");
    Cela n'arrive pas à déchiffrer (j'ai l'exception comme quoi le mot de passe n'est pas correct alors que c'est le même.

    C'est le "salt" récupéré qui ne semble pas bon car il devrait être identique à celui en sortie du premier socket mais ce n'est pas le cas. Le "salt" est récupéré de la chaine de caractère qui arrive par la socket. Je pense que c'est dû au fait des caractères spéciaux qui semblent transformés par des points d'interrogation. Peut être que je dois encoder ma chaine de caractère avant de l'envoyer puis la décoder à l'arriver afin de conserver exactement le même contenu mais je ne sais pas comment.

    De plus, il se peut que la chaine de caractère chiffrée possède un retour à la ligne ce qui pose problème au niveau du "entree.readLine()" qui me permet de lire ce qui a été envoyé.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    �����_�kj~��
    9�.Mב^:(�P��jҶΐ�O���T�SW3ʵ���c���
    Le problème vient peut être du charset utilisé pour convertir en String qui ne correspond pas? (UTF-8 dans mon cas)
    Peut être faudrait-il que je manipule des byte plutôt que des String à travers ma socket? (je ne sais pas comment faire dans ce cas)

    Pouvez-vous m'aider svp?
    Diplomes: DUT informatique et Master 2 MIAGE.
    Développeur Java/J2EE (principalement), .NET (niveau scolaire mais je compte m'améliorer ) et Web (HTML, PHP...).

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Quand on chiffre des données cela donne des octets binaires, pas du texte. Tu ne peux pas le mettre dans une String, de nombreux octets sont incompatibles avec du texte. Et puis de toute façon si c'est pas du texte ce n'est pas une bonne idée d'en faire une String.
    Tes données chiffrées, tu les obtiens dans un ByteArrayOutputStream, n'est-ce pas ? Eh bien, récupère simplement le byte[] avec toByteArray(), et ne touche pas à la classe String.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Points : 187
    Points
    187
    Par défaut
    Bonjour et merci pour ton retour. Cela fonctionne en ne manipulant que des bytes au travers de ma socket.

    Pour ajouter de la sécurisation dans les échanges (qui pour le moment ne se font qu'en local) et afin de découvrir SSL (je fais de l'auto-formation pour monter un peu en compétence sur des aspects sécurité), je voudrais utiliser SSL avec ma socket.

    J'utilise donc ceci coté serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SSLContext ctx = SSLContext.getDefault();
    SSLServerSocketFactory factory = ctx.getServerSocketFactory();
    SSLServerSocket serverSocket =  (SSLServerSocket) factory.createServerSocket(10007);
    Et ceci côté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SSLContext ctx = SSLContext.getDefault();
    SSLSocketFactory factory = ctx.getSocketFactory();
    SSLSocket clientSocket = (SSLSocket) factory.createSocket("127.0.0.1", 10007);
    Lorsque le serveur essaye d'envoyer ma clé de chiffrement AES au client (première chose qu'il fait pour ensuite que tous les messages soient chiffrés avec cette clé), cela se fait par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sortie = new DataOutputStream(clientSocket.getOutputStream());
    ...
    sortie.writeInt(texteCle.getBytes().length);
    sortie.write(texteCle.getBytes());
    Or, dès le premier writeInt() j'ai une exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javax.net.ssl.SSLHandshakeException: no cipher suites in common
    En regardant sur internet j'ai vu que c'est dû au fait que je n'ai pas défini de certificat (avec keystore et trustore). C'est bien ca?

    Que dois-je faire exactement pour que ca fonctionne? (j'ai un certificat auto-signé et un keystore jks déjà d'un autre projet d'auto-formation je ne sais pas si cela suffirait).
    Diplomes: DUT informatique et Master 2 MIAGE.
    Développeur Java/J2EE (principalement), .NET (niveau scolaire mais je compte m'améliorer ) et Web (HTML, PHP...).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Oui , tu essaies de construire un SSLContext sans keystore ni truststore.

    Il te faut en effet un keystore et un truststore avec un ou des certificats auto-signés ou signés par un autre certificat qui sera ta racine.
    Tu peux aussi voir un CA qui te signera ton certificat, il y a des essais de 30 jours disponible gratuitement.

Discussions similaires

  1. Envoi d'une chaine de caractéres par paramétre
    Par hadjiphp dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2009, 14h58
  2. Réponses: 5
    Dernier message: 26/08/2008, 16h00
  3. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  4. Réponses: 3
    Dernier message: 26/07/2006, 14h58
  5. Réponses: 4
    Dernier message: 26/12/2005, 17h01

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