Quote Originariamente inviata da andbin Visualizza il messaggio
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