
Originariamente inviata da
andbin
bisognerebbe vedere meglio il contesto.
Eccolo :
codice:
package appello19Febbraio2014; // OK
import java.util.*;
import java.io.*;
import java.net.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
class Host {
private SendKey sk;
private KeyPair kp;
private Cipher cipher , decipher;
private int UDPPort;
public Host(int skPort){
try{
sk = new SendKey(skPort);
sk.start();
DatagramSocket dSocket = new DatagramSocket(UDPPort);
}catch(Exception err){
err.printStackTrace();
}
}//COSTRUTTORE
class SendKey extends Thread{
private ServerSocket sSocket;
private int skPort;
public SendKey(int skPort){
this.skPort = skPort;
try{
sSocket = new ServerSocket(skPort);
}catch(Exception err){
err.printStackTrace();
}
}
public void run(){
try{
while(true){
Socket s = sSocket.accept();
InputStream in = s.getInputStream();
in.read();
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1000);
kp = kpg.generateKeyPair();
decipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decipher.init(Cipher.DECRYPT_MODE , kp.getPrivate());
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE , kp.getPrivate());
OutputStream out = s.getOutputStream();
out.write(kp.getPublic().getEncoded());
}
}catch(Exception err){
err.printStackTrace();
}
}
}//THREAD SEND KEY
class gestisciRichieste extends Thread {
private Socket s;
private DatagramSocket dSocket;
private int UDPPort;
public gestisciRichieste(Socket s , int UDPPort){
try{
this.s = s;
this.UDPPort = UDPPort;
DatagramSocket dSocket = new DatagramSocket(UDPPort);
this.start();
}catch(Exception err){
err.printStackTrace();
}
}
public void run(){
try{
while(true){
InputStream in = s.getInputStream();
byte [] richiestaByte = new byte [1000];
int numByte = in.read(richiestaByte);
richiestaByte = Arrays.copyOf(richiestaByte , numByte);
String richiesta = new String(decipher.doFinal(richiestaByte));
int pos = richiesta.indexOf("@");
String ip = richiesta.substring(0,pos);
String messaggio = richiesta.substring(pos+1);
in.close();
byte [] buf = cipher.doFinal(messaggio.getBytes());
InetAddress clientAdd = InetAddress.getByName(ip);
DatagramPacket packet = new DatagramPacket(buf , buf.length , clientAdd , UDPPort);
dSocket.send(packet);
}
}catch(Exception err){
err.printStackTrace();
}
}
}// THREAD GESTISCI RICHIESTE
public static void main (String [] args){
try{
int skPort = 6900;
ServerSocket servSocket = new ServerSocket(6800);
int UDPPort = 7700;
Host host = new Host(skPort);
while(true){
Socket s = servSocket.accept();
gestisciRichieste gr = host.new gestisciRichieste(s , UDPPort);
}
}catch(Exception err){
err.printStackTrace();
}
}//MAIN
}//HOST
L'invio del pacchetto è nella classe gestisciRichieste