FEAT: Multiclient + Crypté + Pseudo

This commit is contained in:
Lucàs
2022-12-05 13:03:14 +01:00
parent 6466284b1b
commit 75e873d44f
14 changed files with 525 additions and 196 deletions
+71 -50
View File
@@ -1,71 +1,92 @@
package client;
import java.io.*;
import utils.RSA;
import utils.ResolutionDeNom;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.rmi.UnknownHostException;
import java.security.KeyPair;
import java.security.PublicKey;
import java.util.Objects;
import java.util.Scanner;
import reseau.RSA;
public class Client {
public static final Scanner scan = new Scanner(System.in);
private final String SERVER_IP;
private final int SERVER_PORT;
private final Scanner scanner;
private ObjectInputStream inputStream;
private ObjectOutputStream outputStream;
private KeyPair clientKeys;
private PublicKey serverKey;
public static void main(String[] args) {
Socket serverSocket = null;
ObjectOutputStream out = null;
ObjectInputStream in = null;
private String pseudo;
// Clé de chiffrage
KeyPair clientKeyPair = RSA.genererCle();
PublicKey serverKey = null;
public Client(String ip, int port) {
this.SERVER_IP = ResolutionDeNom.getIPAddress(ip);
this.SERVER_PORT = port;
this.scanner = new Scanner(System.in);
this.clientKeys = RSA.genererCle();
}
// Création des Sockets
try {
serverSocket = new Socket("localhost", 4444);
System.out.println("Connecté au serveur");
out = new ObjectOutputStream(serverSocket.getOutputStream());
in = new ObjectInputStream(serverSocket.getInputStream());
public void start() {
System.out.print("Saisir un pseudo: ");
pseudo = scanner.nextLine();
// On envoie la clé de chiffrage
out.writeObject(clientKeyPair.getPublic());
try (Socket socket = new Socket(SERVER_IP, SERVER_PORT)) {
inputStream = new ObjectInputStream(socket.getInputStream());
outputStream = new ObjectOutputStream(socket.getOutputStream());
serverKey = (PublicKey) in.readObject();
exchangeKeys();
} catch (UnknownHostException e) {
System.out.println("Destination unknown");
System.exit(-1);
} catch (IOException e) {
System.out.println("now to investigate this IO issue");
System.exit(-1);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
sendMessage(pseudo);
// Communication
String message;
byte[] messageCrypte;
try {
// Ecoute du serveur
ListenThread threadClient = new ListenThread(this);
threadClient.start();
// Ecoute de l'entrée du clavier
System.out.println("Tappez 'bye' pour quitter\n");
String message;
do {
// Envoi du message
System.out.print("client > ");
message = scan.nextLine();
messageCrypte = RSA.encrypter(message, serverKey);
out.writeObject(messageCrypte);
message = scanner.nextLine();
sendMessage(message);
} while (!Objects.equals(message, "bye"));
// Reception du message
messageCrypte = (byte[]) in.readObject();
message = RSA.decrypter(messageCrypte, clientKeyPair.getPrivate());
System.out.printf("serveur > %s\n", message);
} while (!message.equals("bye"));
out.close();
in.close();
serverSocket.close();
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} catch (ConnectException e) {
System.err.println("Serveur non trouvé");
}catch (EOFException e) {
System.err.println("Connexion perdue");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public void exchangeKeys() throws IOException, ClassNotFoundException {
// Envoie sa clé
outputStream.writeObject(clientKeys.getPublic());
// Attend la clé du serveur
serverKey = (PublicKey) inputStream.readObject();
}
public void sendMessage(String message) throws IOException {
byte[] messageCrypte = RSA.encrypter(message, serverKey);
outputStream.writeObject(messageCrypte);
}
public String getMessage() throws IOException, ClassNotFoundException {
byte[] messageCrypte = (byte[]) inputStream.readObject();
return RSA.decrypter(messageCrypte, clientKeys.getPrivate());
}
public static void main(String[] args) {
Client client = new Client("localhost", 4444);
client.start();
}
}
+35
View File
@@ -0,0 +1,35 @@
package client;
import java.io.EOFException;
import java.io.IOException;
import java.net.SocketException;
/**
* Thread for clients
*/
public class ListenThread extends Thread {
private final Client client;
public ListenThread(Client client) {
this.client = client;
}
@Override
public void run() {
try {
String message;
while (true) {
message = client.getMessage();
System.out.println(message);
}
} catch (SocketException ignored) {
System.out.println("Vous avez quitté le salon");
} catch (EOFException ignored) {
System.err.println("Connexion perdue");
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}