JAVA课程实验报告实验五Java网络编程及安全

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAVA课程实验报告实验五Java⽹络编程及安全
北京电⼦科技学院(BESTI)
实验报告
课程:Java程序设计班级:1353 姓名:韩⽟琪学号:20135317
成绩:指导教师:娄嘉鹏实验⽇期:2015.6.10
实验密级:预习程度:实验时间:15:30--18:00
仪器组次:必修/选修:选修实验序号:5
实验名称:实验五 Java⽹络编程及安全
实验⽬的与要求:
1.掌握Socket程序的编写;
2.掌握密码技术的使⽤;
3.设计安全传输系统。

实验仪器:
名称型号数量
PC Lenovo1
实验楼环境/1
Eclipse/1
⼀、实验内容
1. 基于Java Socket实现安全传输
2. 基于TCP实现客户端和服务器,结对编程⼀⼈负责客户端,⼀⼈负责服务器
3. 使⽤Git进⾏版本控制
4. 选择对称算法进⾏数据加解密.
5. 选择⾮对称算法对对称加密密钥进⾏密钥分发.
6. 选择合适的Hash算法进⾏完整性验证.
⼆、实验步骤
1.思路
混合密钥系统:
 信息(明⽂)采⽤DES密钥加密,使⽤RSA加密前⾯的DES密钥信息,最终将混合信息进⾏传递。

同时⽤hash函数将明⽂进⾏⽤作验证。

⽽接收⽅接收到信息后,⽤RSA解密DES密钥信息,再⽤RSA解密获取到的密钥信息解密密⽂信息,最终就可以得到我们要的信息(明⽂)。

⽤hash函数对解出的明⽂进⾏验证,与发送过来的hash值相等,验证通过。

2.使⽤书上的客户端和服务器代码与⽼师给的代码组合,实现上述功能。

服务器代码:
package server;
import .*;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
public class Server {
public static void main(String args[]) throws Exception {
ServerSocket link = null;
Socket socket = null;
try {
link = new ServerSocket(8080);// 创建服务器套接字
System.out.println("端⼝号:" + link.getLocalPort());
System.out.println("服务器已经启动...");
socket = link.accept(); // 等待客户端连接
System.out.println("已经建⽴连接");
//获得⽹络输⼊流对象的引⽤
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获得⽹络输出流对象的引⽤
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
// 使⽤服务器端RSA的私钥对DES的密钥进⾏解密
String line = in.readLine();
BigInteger cipher = new BigInteger(line);
FileInputStream f = new FileInputStream("Skey_RSA_priv.dat");
ObjectInputStream b = new ObjectInputStream(f);
RSAPrivateKey prk = (RSAPrivateKey) b.readObject();
BigInteger d = prk.getPrivateExponent();
BigInteger n = prk.getModulus();//mod n
BigInteger m = cipher.modPow(d, n);//m=d (mod n)
System.out.println("d= " + d);
System.out.println("n= " + n);
System.out.println("m= " + m);
byte[] keykb = m.toByteArray();
// 使⽤DES对密⽂进⾏解密
String readline = in.readLine();//读取客户端传送来的数据
FileInputStream f2 = new FileInputStream("keykb1.dat");
int num2 = f2.available();
byte[] ctext = parseHexStr2Byte(readline);
Key k = new SecretKeySpec(keykb,"DESede");
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte[] ptext = cp.doFinal(ctext);
String p = new String(ptext, "UTF8");//编码转换
System.out.println("从客户端接收到信息为:" + p); //打印解密结果
// 使⽤Hash函数检测明⽂完整性
String aline3 = in.readLine();
String x = p;
MessageDigest m2 = MessageDigest.getInstance("MD5");//使⽤MD5算法返回实现指定摘要算法的 MessageDigest对象 m2.update(x.getBytes());
byte a[] = m2.digest();
String result = "";
for (int i = 0; i < a.length; i++) {
result += Integer.toHexString((0x000000ff & a[i]) | 0xffffff00).substring(6);
}
System.out.println(result);
if (aline3.equals(result)) {
System.out.println("匹配成功");
}
out.println("匹配成功");
out.close();
in.close();
link.close();
} catch (Exception e) {
System.out.println(e);
}
}
//⼆进制转换成⼗六进制,防⽌byte[]数字转换成string类型时造成的数据损失
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());//将字符串中的⼩写字母转换成⼤写字母,然后加在字符串上
}
return sb.toString();
}
//将⼗六进制转换为⼆进制
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1),16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
}
3.链接成功,接收信息解密信息成功,匹配成功
4.结对伙伴:20135337 朱荟潼
负责客户端
三、实验中遇到的问题
1. 两台电脑⼀直⽆法联通
刚开始我们⽤的IP地址是从⽹络上搜ip出来的地址,然后显⽰连接超时。

之后⽤在命令⾏中⽤ipconfig查看地址,找到⾃⼰的IPv4地址,但是换上之后还是显⽰连接超时。

之后我们不连接在cmcc-edu中,⽽是⼀台电脑连接⽹络然后放wifi给另⼀台电脑使⽤,然后再次连接两台电脑,连通。

2. 显⽰连通了之后,客户端向服务器发送消息,但是显⽰有异常。

将端⼝换了⼀个变成端⼝8080之后,再次连接发送消息,成功。

相关文档
最新文档