实验报告五
实验三:实验报告
课程:程序设计与数据结构
班级: 1623
姓名: 张旭升
学号:20162329
指导教师:娄嘉鹏 王志强
实验日期:5月10日
实验密级: 非密级
预习程度: 已预习
必修/选修: 必修
实验序号: cs_29
实验名称: Java面向对象程序设计
实验内容
任务一:
编写MyBC.java实现中缀表达式转后缀表达式的功能
编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能
任务二:
结对编程:一人负责客户端,另一人负责服务器
注意责任归宿,要会通过测试证明自己没有问题
基于Java Socket实现客户端/服务器功能,传输方式用TCP
客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
客户端显示服务器发送过来的结果
任务三:
客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
其他要求同任务二
任务四:
客户端和服务器用DH算法进行3DES或AES算法的密钥交换
其他要求同任务三
任务五:
服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
实验要求
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
-
完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是 运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决 办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可 以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
-
严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验步骤
(一)建立客户端服务器连接
(二)创建MyDC MyBC类
(三)实现客户端服务器的交互
(四)调用MyDC MyBC进行相关转化计算
(五)使用密码学算法对相关数据加密传输
实验过程
创建MyDC MyBC:
实现客户端交互传输(调用MyDC MyBC):
对相关传输数据加密处理:
我主要负责的是服务器端,以下是相关代码:
public class TalkServer {
public static void main(String args[]) {
MyDC counts = new MyDC();
String Message ="";
try {
ServerSocket server = null;
try {
server = new ServerSocket(9005);
System.out.println("连接成功!");
//创建一个ServerSocket在端口4700监听客户请求
} catch (Exception e) {
System.out.println("can not listen to:" + e);
//出错,打印出错信息
}
Socket socket = null;
try {
socket = server.accept();
} catch (Exception e) {
System.out.println("Error." + e);
//出错,打印出错信息
}
String line;
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedWriter bw = new BufferedWriter(new FileWriter("lwk_pub_key.txt"));
//解密
ObjectInputStream B=new ObjectInputStream(new FileInputStream("zxs_RSA_priv.txt"));
RSAPrivateKey prk=(RSAPrivateKey)B.readObject( );
BigInteger D=prk.getPrivateExponent();
BigInteger N=prk.getModulus();
//加密
ObjectInputStream b=new ObjectInputStream(new FileInputStream("lwk_RSA_pub.txt"));
RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
MessageDigest m1 = MessageDigest.getInstance("MD5");
//由系统标准输入设备构造BufferedReader对象
line = is.readLine();
while (!line.equals("OK")) {
if (line.equals("File")) {
line = is.readLine();
while (!line.equals("Yes")) {
bw.write(line);
bw.newLine();
line = is.readLine();
}
bw.close();
line = is.readLine();
} else {
System.out.println("服务器接收哈希值:" + line);
String Mi = line;
line = is.readLine();
String ctext = line;
BigInteger C = new BigInteger(ctext);
BigInteger M = C.modPow(D, N);
byte[] arr = M.toByteArray();
for (byte i : arr)
Message += (char) i;
System.out.println("解密结果:" + Message);
m1.update(Message.getBytes("UTF8"));
byte s1[] = m1.digest();
String result = "";
for (int i = 0; i < s1.length; i++) {
result += Integer.toHexString((0x000000ff & s1[i]) | 0xffffff00).substring(6);
}
if (result.equals(Mi)) {
String A = counts.evaluate(Message);
System.out.println("计算结果:" + A);
byte ptext[] = A.getBytes("UTF8");
BigInteger m = new BigInteger(ptext);
BigInteger c = m.modPow(e, n);
os.println(c.toString());
os.flush();
System.out.println("服务器器发送:" + c);
line = is.readLine();
}
}
}
os.close(); //关闭Socket输出流
is.close();//关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
} catch (Exception e) {
System.out.println("Error:" + e);
//出错,打印出错信息
}
}
}
实验中遇到的问题
- 实验中主要问题在于我与搭档之间的配合默契不足,再加上搭档的相关知识不够牢固,导致进度很慢,我这边虽然问题较少,但是他负责的客户端总是有很多问题。
实验不足
实验中还有一个第六项任务,我也尝试了一下,但是好多次都是服务器和客户端的连接出现问题,导致APP无法正常运行,结果就计划流产了。
实验心得
- 在本次实验中我们既学习到了相关网络编程的知识,又在这基础上使用了java密码算法,这对未来其他的学习打下了很好的基础。