From 121cf32f9f1dc9605b8ab9d2bc11ece96104e998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= Date: Tue, 29 Nov 2022 14:57:30 +0100 Subject: [PATCH] =?UTF-8?q?Envoi=20avec=20Message=20Crypt=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 67 +++++++++----------------------------- README.md | 16 +++++++++ key.ser | Bin 0 -> 263 bytes src/client/Client.java | 68 ++++++++++++++++++++++++--------------- src/reseau/AES.java | 49 ++++++++++++++-------------- src/serveur/Serveur.java | 50 ++++++++++++++++------------ 6 files changed, 128 insertions(+), 122 deletions(-) create mode 100644 README.md create mode 100644 key.ser diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3be25e8..f9b14c2 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,15 +2,13 @@ - + + - - - - + - { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "WebServerToolWindowFactoryState": "false", + "codeWithMe.voiceChat.enabledByDefault": "false", + "project.structure.last.edited": "Project", + "project.structure.proportion": "0.0", + "project.structure.side.proportion": "0.0" } -}]]> - +} + diff --git a/README.md b/README.md new file mode 100644 index 0000000..2abbebd --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Question 6 + +## Avant la communication +Utiliser le RSA, avant toute communication. +Le client et le serveur génèrent 2 clés (une publique et une privées) +Ils s'échangent leurs clé publiques. + +![img](https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Asymmetric_cryptography_-_step_1.svg/800px-Asymmetric_cryptography_-_step_1.svg.png) + +## Pendant la communication +Lors qu'un utilisateur veut envoyer un message, il crypte son +message avec la clé pulique de son interlocuteur et lui envoie. +La personne qui reçois le message, le décrypte le message avec +sa propre clé privée. + +![img](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Asymmetric_cryptography_-_step_2.svg/800px-Asymmetric_cryptography_-_step_2.svg.png) \ No newline at end of file diff --git a/key.ser b/key.ser new file mode 100644 index 0000000000000000000000000000000000000000..ce924583864240073a45e39fb463638f4e6d42dc GIT binary patch literal 263 zcmZ4UmVvdnh(RPPu`E%qI5oMnD6^ze&pWj;D79ekPyfvwvz9tDF|hbBa3{^I7}{8%M|kCI*Iz0tN;Kjzzov zW-}$liUAb`IfmC2F-T%_GT11faxf4A>Mdg61FHkMRnIlAG#6PCXd_#&t8 %s\n", message); - } else { + // Communication + String message; + byte[] messageCrypte; + try { + do { + // Envoi du message System.out.print("client > "); message = scan.nextLine(); - out.println(message); - } - ecoute = !ecoute; - } while (!message.equals("bye")); + messageCrypte = AES.encrypter(message, key); + out.writeObject(messageCrypte); - //deconnexion - //fermeture des Sockets - out.close(); - in.close(); - serverSocket.close(); + // Reception du message + messageCrypte = (byte[]) in.readObject(); + message = AES.decrypter(messageCrypte, key); + System.out.printf("serveur > %s -> %s\n", new String(messageCrypte, StandardCharsets.UTF_8), message); + } while (!message.equals("bye")); + + out.close(); + in.close(); + serverSocket.close(); + }catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } } } diff --git a/src/reseau/AES.java b/src/reseau/AES.java index 1b3c44f..5ea8694 100644 --- a/src/reseau/AES.java +++ b/src/reseau/AES.java @@ -1,39 +1,30 @@ package reseau; import javax.crypto.*; -import java.nio.file.Files; -import java.nio.file.Path; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.security.*; import java.util.Arrays; public class AES { - public static byte[] genererCle() { - byte[] data; - byte[] result; - byte[] original = null; + public static Key genererCle() { + Key key = null; + try { - KeyGenerator kg = KeyGenerator.getInstance("DES"); - Key key = kg.generateKey(); - return key.getEncoded(); -// Cipher cipher = Cipher.getInstance("DES") ; -// cipher.init(Cipher.ENCRYPT_MODE, key) ; -// data = "Hello World".getBytes() ; -// result = cipher.doFinal(data) ; -// cipher.init(Cipher.DECRYPT_MODE, key) ; -// original = cipher.doFinal(result) ; -// System.out.println("Decrypted data :" + Arrays.toString(original)) ; + KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); + key = keyGenerator.generateKey(); } catch (Exception e) { e.printStackTrace(); } - return original; + return key; } - public static byte[] decrypter(byte[] msg, Key key) { + public static String decrypter(byte[] msg, Key key) { try { Cipher cipher = Cipher.getInstance("DES") ; cipher.init(Cipher.DECRYPT_MODE, key); - return cipher.doFinal(msg); + return new String(cipher.doFinal(msg), StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); } @@ -51,12 +42,22 @@ public class AES { return null; } - public static void sauvegarderFichier(Key key) { - Path fileName = Path.of("./cle.txt"); - Files.writeString(fileName, new String(key)); + public static void sauvegarderCle(Key key) { + + try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("key.ser"))) { + objectOutputStream.writeObject(key); + } catch (IOException e) { + throw new RuntimeException(e); + } } - public static void main(String[] args) { - + public static Key chargerCle() { + Key key = null; + try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("key.ser"))) { + key = (Key) objectInputStream.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + return key; } } diff --git a/src/serveur/Serveur.java b/src/serveur/Serveur.java index 0a5be06..015bfcc 100644 --- a/src/serveur/Serveur.java +++ b/src/serveur/Serveur.java @@ -1,8 +1,13 @@ package serveur; +import reseau.AES; + import java.io.*; import java.net.ServerSocket; import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.Arrays; import java.util.Scanner; public class Serveur { @@ -13,6 +18,7 @@ public class Serveur { public static void main(String[] args) { ServerSocket serverSocket = null; Socket clientSocket = null; + Key clientKey; // Connexion try { @@ -26,30 +32,34 @@ public class Serveur { // Un client a été trouvé System.out.println("Client connecté"); - boolean connectee = true; - boolean reception = true; - - BufferedReader in = null; - - PrintWriter out = null; + ObjectInputStream in; + ObjectOutputStream out; try { - in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + in = new ObjectInputStream(clientSocket.getInputStream()); + out = new ObjectOutputStream(clientSocket.getOutputStream()); - out = new PrintWriter(clientSocket.getOutputStream(), true); + // On récupère la clé du client + clientKey = (Key) in.readObject(); - String message = null; + System.out.println("Clé reçue"); + System.out.println(Arrays.toString(clientKey.getEncoded())); + + // Communication + String message; + byte[] messageCrypte; do { - if (reception) { - message = in.readLine(); - System.out.printf("client > %s\n", message); - } else { - System.out.print("serveur > "); - message = scan.nextLine(); - out.println(message); - } + // Envoi du message + messageCrypte = (byte[]) in.readObject(); + message = AES.decrypter(messageCrypte, clientKey); + System.out.printf("client > %s -> %s\n", new String(messageCrypte, StandardCharsets.UTF_8), message); - reception = !reception; + + // Reception du message + System.out.print("serveur > "); + message = scan.nextLine(); + messageCrypte = AES.encrypter(message, clientKey); + out.writeObject(messageCrypte); } while (!message.equals("bye")); in.close(); @@ -59,8 +69,8 @@ public class Serveur { } catch (IOException e) { e.printStackTrace(); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); } - - } }