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):
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:
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:
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:
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:
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?
Partager