
Originariamente inviata da
andbin
Ma senza avere chiaro il contesto .... è quasi impossibile dare una risposta utile.
Il contesto è lo stesso del post di ieri;
un Client che invia una richiesta ad un Host che poi la reinvia al Client.
Prima funzionava...ora no
Ecco il codice :
Client :
codice:
import java.util.*;
import java.io.*;
import java.net.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
public class Client {
InetAddress groupAddress;
InetAddress serverAddress;
int serverPort; // SARA' LA 3100
int multicastPort; //SARA' LA 5400
Cipher cipher, decipher;
MulticastSocket gkSocket;
Socket socket; //SOCKET PER INVIARE LA RICHIESTA CIFRATA
public Client(InetAddress groupAddress , int multicastPort , int serverPort){
this.groupAddress = groupAddress;
this.multicastPort = multicastPort;
this.serverPort = serverPort;
try{
gkSocket = new MulticastSocket(multicastPort); // MULTICASTSOCKET COLLEGATO ALLA PORTA 5400
}catch(IOException ioe){
ioe.printStackTrace();;
}
}// COSTRUTTORE CLIENT
public void RiceviChiavePubblica(){
try{
gkSocket.joinGroup(groupAddress);
byte [] buf = new byte [1000];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
gkSocket.receive(packet);
serverAddress = packet.getAddress(); // RICAVO L'INDIRIZZO DEL SERVER DA CUI HO RICEVUTO LA CHIAVE PUBBLICA
X509EncodedKeySpec ks = new X509EncodedKeySpec(packet.getData());
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(ks);
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
}catch(IOException ioe){
ioe.printStackTrace();
}catch(Exception e){
try{
gkSocket.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}// RICEVI CHIAVE PUBBLICA
public void InviaRichiesta(String richiesta){
try{
socket = new Socket(serverAddress, serverPort);
OutputStream out = socket.getOutputStream();
byte [] rich = cipher.doFinal(richiesta.getBytes());
out.write(rich);
//RICEZIONE DELLA RICHIESTA IN CHIARO E STAMPA SU VIDEO DEL RISULTATO:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String risultato = in.readLine();
System.out.println("Richiesta Ricevuta : " +risultato);
//
out.close();
in.close();
}catch(IOException ioe){
ioe.printStackTrace();
}catch(Exception e){
try{
socket.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}// INVIA RICHIESTA
public static void main(String [] args){
try{
InetAddress groupAddress = InetAddress.getByName("224.0.0.1");
int serverPort = 3100;
int multicastPort = 5400;
Client client = new Client(groupAddress , multicastPort , serverPort);
client.RiceviChiavePubblica();
client.InviaRichiesta("param");
}catch(Exception e){
e.printStackTrace();
}
}// MAIN
}// CLIENT
Host :
codice:
import java.util.*;
import java.io.*;
import java.net.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
public class Host extends Thread{
private InetAddress groupAddress;
private int multicastPort;
private MulticastSocket mSocket;
private Cipher decipher; //CIPHER PER DECIFRARE LA RICHIESTA
private KeyPair kp;
public Host(InetAddress groupAddress , int multicastPort){
this.groupAddress = groupAddress;
this.multicastPort = multicastPort;
try{
mSocket = new MulticastSocket(multicastPort);
}catch(Exception e){
e.printStackTrace();
}
}//COSTRUTTORE HOST
public void run(){
try{
while(true){
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
kp = kpg.generateKeyPair();
byte [] buf = new byte [1000];
buf = kp.getPublic().getEncoded();
DatagramPacket packet = new DatagramPacket(buf , buf.length , groupAddress , multicastPort);
mSocket.send(packet);
Thread.sleep(1000); //FACCIAMO ATTENDERE PER INVIARE LA CHIAVE OGNI SECONDO
}
}catch(Exception e){
e.printStackTrace();
}
}// RUN
class gestisciRichieste extends Thread{
Socket s;
public gestisciRichieste(Socket s){
this.s = s;
this.start();
}
public void run(){
try{
while(true){
decipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decipher.init(Cipher.DECRYPT_MODE , kp.getPrivate());
InputStream in = s.getInputStream();
byte [] richiestaByte = new byte [1000];
int numByte = in.read(richiestaByte);
richiestaByte = Arrays.copyOf(richiestaByte, numByte);
byte [] richiestaDecriptata = decipher.doFinal(richiestaByte);
String richiestaCalcolata = calcola(new String(richiestaDecriptata));
PrintWriter out = new PrintWriter(s.getOutputStream() , true);
out.println(richiestaCalcolata);
in.close();
out.close();
}
}catch(Exception e){
try{
s.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}//RUN
}//GESTISCI RICHIESTE
public String calcola(String s){
return s;
}
public static void main(String [] args){
try{
InetAddress groupAddress = InetAddress.getByName("224.0.0.1");
int multicastPort = 5400;
ServerSocket sSocket = new ServerSocket(3100);
Host host = new Host(groupAddress , multicastPort);
host.start();
while(true){
Socket sclient = sSocket.accept();
gestisciRichieste gr = host.new gestisciRichieste(sclient);
}
}catch(Exception e){
e.printStackTrace();
}
}// MAIN
}// HOST