Bonjour à tous!
Bon alors j'ai un petit problème.. Je suis en trin de coder une application qui permet à deux utilisateurs distants de communiquer, le text envoyé étant crypté en RSA!
Aucun problème pour le cryptage et les socket (c'est déjà ça) mais j'ai un gros problème de transfert des clés publique!
Les clés sont générés comme ceci:
a la suite de quoi j'ai 2 fichiers sur mon disque dur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 KeyPairGenerator pairgen = KeyPairGenerator.getInstance("RSA"); SecureRandom random = new SecureRandom(); pairgen.initialize(2048, random); KeyPair keyPair = pairgen.generateKeyPair(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(publicOutputFileName)); out.writeObject(keyPair.getPublic()); out.close(); out = new ObjectOutputStream( new FileOutputStream(privateOutputFileName)); out.writeObject(keyPair.getPrivate()); out.close();
Lorsqu'un client se connecte au serveur, les deux s'échangent leur clés. et la copient sur leur disques avec la méthode:
Envoie de la clé
reception de l'autre coté:
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 public void sendPublicKey() throws IOException{ //on deballe la clé String path="keys/keypublic.data"; ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(path)); byte[] key=null; //lecture de la clé try { RSAPublicKey publicKey = (RSAPublicKey )keyIn.readObject(); key=publicKey.getEncoded(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } keyIn.close(); //envoie des données byte [] buffer=meth.convertinttobyte(key.length); //concatenation des tableaux byte []concat=meth.concatByte(buffer,key); System.out.println("Envoi de x données:"+key.length); //on envoie le buffer puis les data byteout.write(concat); byteout.flush(); }
Le problème c'est que les fichiers avant et après envoit ne sont pas les mêmes et il est impossible du coup de decrypter les données... Si je place moi meme les cléfs publique, mon programme marche très bien!
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 private void receptionPublic(String path2) { PrintWriter writer; try { writer = new PrintWriter(new BufferedWriter (new FileWriter(path))); reponse=""; //taille du buffer bytein.read(byteresponse,0,4); //transformation en int int size=meth.byteArrayToInt(byteresponse, 0); count = bytein.read(byteresponse,0,size); reponse = meth.convertByteToText2(byteresponse,count); writer.println(reponse); writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ; }
Je pense que c'est un problème d'écriture dans le fichier, à l'origine j'ai un objet de type RSAPublicKey dans les fichiers, mais je les lis comme des bytes pour les envoyer sur la socket. Quelqu'un peut m'aider? :'(
Merci![]()
Partager