Envoi avec Message Crypté

This commit is contained in:
Lucàs
2022-11-29 14:57:30 +01:00
parent 35a08a9f1e
commit 121cf32f9f
6 changed files with 128 additions and 122 deletions
+15 -52
View File
@@ -2,15 +2,13 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/src/reseau/AES.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/client/Client.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/client/Client.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/reseau/AES.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/reseau/AES.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/serveur/Serveur.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/serveur/Serveur.java" afterDir="false" />
</list>
<list id="84fd72d2-dba6-4275-83d3-958fab491b17" name="Changes by burgu" comment="">
<change beforePath="$PROJECT_DIR$/src/client/Client.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/client/Client.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/serveur/Serveur.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/serveur/Serveur.java" afterDir="false" />
</list>
<list id="84fd72d2-dba6-4275-83d3-958fab491b17" name="Changes by burgu" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -26,42 +24,6 @@
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="LineStatusTrackerManager">
<file path="$PROJECT_DIR$/src/serveur/Serveur.java">
<ranges>
<range start1="5" end1="5" start2="5" end2="6" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="7" end1="7" start2="8" end2="12" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="9" end1="16" start2="14" end2="14" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="17" end1="17" start2="15" end2="17" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="18" end1="19" start2="18" end2="20" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="20" end1="21" start2="21" end2="22" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="24" end1="24" start2="25" end2="26" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="25" end1="26" start2="27" end2="29" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="28" end1="30" start2="31" end2="32" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="31" end1="31" start2="33" end2="35" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="32" end1="35" start2="36" end2="37" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="36" end1="37" start2="38" end2="42" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="38" end1="47" start2="43" end2="49" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="48" end1="48" start2="50" end2="51" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="49" end1="50" start2="52" end2="59" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="55" end1="56" start2="64" end2="64" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
</ranges>
</file>
<file path="$PROJECT_DIR$/src/client/Client.java">
<ranges>
<range start1="8" end1="8" start2="8" end2="9" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="10" end1="10" start2="11" end2="14" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="11" end1="12" start2="15" end2="16" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="14" end1="14" start2="18" end2="19" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="15" end1="15" start2="20" end2="21" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="16" end1="17" start2="22" end2="23" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="18" end1="20" start2="24" end2="26" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="28" end1="35" start2="34" end2="47" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
<range start1="36" end1="36" start2="48" end2="50" changelist="84fd72d2-dba6-4275-83d3-958fab491b17" />
<range start1="38" end1="40" start2="52" end2="53" changelist="79e91d13-7d5f-4b9a-954b-9bc7cde074fc" />
</ranges>
</file>
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
@@ -73,18 +35,18 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"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"
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;codeWithMe.voiceChat.enabledByDefault&quot;: &quot;false&quot;,
&quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.0&quot;
}
}]]></component>
<component name="RunManager" selected="Application.AES">
}</component>
<component name="RunManager" selected="Application.Client">
<configuration name="AES" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="reseau.AES" />
<module name="projet-mini-chat" />
@@ -177,6 +139,7 @@
<updated>1668515473737</updated>
<workItem from="1668515476841" duration="6049000" />
<workItem from="1669119772164" duration="6834000" />
<workItem from="1669724625302" duration="5444000" />
</task>
<servers />
</component>
+16
View File
@@ -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)
BIN
View File
Binary file not shown.
+37 -21
View File
@@ -1,29 +1,41 @@
package client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.rmi.UnknownHostException;
import java.security.Key;
import java.util.Arrays;
import java.util.Scanner;
import reseau.AES;
public class Client {
public static final Scanner scan = new Scanner(System.in);
public static void main(String[] args) throws IOException {
public static void main(String[] args) {
Socket serverSocket = null;
PrintWriter out = null;
BufferedReader in = null;
boolean ecoute = false;
ObjectOutputStream out = null;
ObjectInputStream in = null;
// Clé de chiffrage
Key key = AES.genererCle();
AES.sauvegarderCle(key);
// Création des Sockets
try {
serverSocket = new Socket("localhost", 4444);
System.out.println("Connecté au serveur");
out = new PrintWriter(serverSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
out = new ObjectOutputStream(serverSocket.getOutputStream());
in = new ObjectInputStream(serverSocket.getInputStream());
// On envoie la clé de chiffrage
out.writeObject(key);
System.out.println("Clé envoyé");
System.out.println(Arrays.toString(key.getEncoded()));
} catch (UnknownHostException e) {
System.out.println("Destination unknown");
System.exit(-1);
@@ -32,24 +44,28 @@ public class Client {
System.exit(-1);
}
String message = null;
// Communication
String message;
byte[] messageCrypte;
try {
do {
//ecoute d'un message
if (ecoute) {
message = in.readLine();
System.out.printf("serveur > %s\n", message);
} else {
// Envoi du message
System.out.print("client > ");
message = scan.nextLine();
out.println(message);
}
ecoute = !ecoute;
messageCrypte = AES.encrypter(message, key);
out.writeObject(messageCrypte);
// 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"));
//deconnexion
//fermeture des Sockets
out.close();
in.close();
serverSocket.close();
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
+25 -24
View File
@@ -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;
}
}
+30 -20
View File
@@ -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 {
// 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 du message
System.out.print("serveur > ");
message = scan.nextLine();
out.println(message);
}
reception = !reception;
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);
}
}
}