=======================KDC.java,KDC密钥分配中心=======================
package first;
import java.awt.BorderLayout;
import java.awt.Container;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Random;
import javax.crypto.SecretKey;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* 密钥分配中心
*/
public class KDC extends JFrame{
private static final long serialVersionUID = 1L;
ServerSocket socket;
Socket connect;
ObjectInputStream in;
ObjectOutputStream out;
//保存用户与KDC共享的密钥
private HashMap<String,SecretKey> keys = new HashMap<String,SecretKey>();
private JTextArea textArea = new JTextArea();
public KDC() throws Exception{
super("密钥分配中心");
Container cp = this.getContentPane();
cp.add(new JScrollPane(textArea),BorderLayout.CENTER);
this.setSize(300,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
socket = new ServerSocket(10000,5);//KDC的Socket初始化,采用端口10000
Thread t = new Thread(new KDCThread());
t.start();//启动线程,接收用户的请求
}
//处理用户的请求
private void dealRequest(String data) throws Exception{
String[] msg = data.split(",");
textArea.append(msg[0]+" 请求与 "+msg[1]+" 通信/n本次业务标识符: "+msg[2]+" /n/n");
sendMsg(msg[0],msg[1],msg[2]);
}
/**
* KDC接收到用户的会话密钥请求后,应答对方
*
* @param ida
* 会话请求方ID
* @param idb
* 被请求会话方ID
* @param random
* 业务标识符
* @throws Exception
*/
private void sendMsg(String ida,String idb,String N1) throws Exception{
String ks = random();//产生一个随机数用于生成密钥
String strMsgToIda = ks+"/"+ida+"/"+idb+"/"+N1;//发送给会话请求方A的信息(未加密)
String strMsgToIdb = ks+","+ida;//发送给会话接收方B的信息(未加密)
byte[] byteMsgToIda = Provider.encrypt(keys.get(ida),strMsgToIda.getBytes());//发送给会话请求方A的信息(已加密)
byte[] byteMsgToIdb1 = Provider.encrypt(keys.get(idb),strMsgToIdb.getBytes());//发送给会话接收方B的信息(用B密钥加密,但未用A密钥加密)
byte[] byteMsgToIdb = Provider.encrypt(keys.get(ida),byteMsgToIdb1);//发送给会话接收方B的信息(已用A的密钥加密)
send(byteMsgToIda);
send(byteMsgToIdb);
connect.close();//关闭连接
}
public void addClient(String id,SecretKey SecretKey){
keys.put(id, SecretKey);
}
public void send(byte[] data) throw