资源简介
作为通讯的双方A和B,都已经分别和KDC拥有会话密钥Ka和Kb,但A、B之间事先没有保密通道,需要依赖KDC为它们的会话分配临时密钥Ks。在完成会话密钥Ks的分配后,A利用Ks对特定文件(test-1.txt)进行加密,并发送给B;B利用Ks对密文进行解密,并对比解密后的明文信息同原来的文件是否一致。
代码片段和文件信息
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 keys = new HashMap();
private JTextArea textArea = new JTextArea();
public KDC() throws Exception{
super(“密钥分配中心“);
Container cp = this.getContentPane();
cp.add(new JScrollPane(textArea)BorderLayout.CENTER);
this.setSize(300300);
this.setVisible(true);
this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
socket = new ServerSocket(100005);//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 idaString idbString 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 idSecretKey SecretKey){
keys.put(id SecretKey);
}
public void send(byte[] data) throws Exception{
int num = data.length;
out.writeInt(num);//发送字节数
out.flush();
out.write(data);//发送数据
out.flush();
}
private String random(){
Random r = new Random();
String id = Math.abs(r.nextInt()%10000)+““;
return id;
}
//用于接收用户请求的线程
private class KDCThread implements Runnable{
public void run() {
while(true){
try {
connect = socket.accept();//循环等待用户请求
out = new objectOutputStream(connect.getOutputStream());
in = new objectInputStream(connect.getInputStream());
//处理接收到的用户请求
dealRequest(in.readUTF());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 379 2010-03-27 20:43 KDC\.project
文件 3214 2010-03-27 20:47 KDC\src\KDC.java
文件 2214 2010-03-27 20:46 KDC\src\Provider.java
文件 6579 2010-03-27 20:57 KDC\src\User.java
文件 297 2010-03-27 20:46 KDC\src\Test.java
文件 7181 2010-03-27 20:57 KDC\bin\User.class
文件 1161 2010-03-27 20:57 KDC\bin\User$1.class
文件 975 2010-03-27 20:57 KDC\bin\User$SendThread.class
文件 1543 2010-03-27 20:57 KDC\bin\User$Communicate.class
文件 550 2010-03-27 20:47 KDC\bin\Test.class
文件 2599 2010-03-27 20:47 KDC\bin\Provider.class
文件 1386 2010-03-27 20:47 KDC\bin\KDC$KDCThread.class
文件 3901 2010-03-27 20:47 KDC\bin\KDC.class
文件 629 2010-03-27 20:43 KDC\.settings\org.eclipse.jdt.core.prefs
文件 421 2010-03-27 20:47 KDC\.classpath
目录 0 2010-03-27 20:43 KDC\src
目录 0 2010-03-27 20:43 KDC\bin
目录 0 2010-03-27 20:43 KDC\.settings
目录 0 2010-03-27 20:43 KDC
----------- --------- ---------- ----- ----
33029 19
- 上一篇:DVD租赁管理系统纯Ecplise
- 下一篇:cropper裁剪支持页面多个图片裁剪
评论
共有 条评论