Java面向对象程序设计
实验内容
- 完成MyBC.java,实现输入中缀表达式,转为后缀表达式并计算结果
- 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十二章, 基于Java Socket实现客户端/服务器功能,客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器,服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器,服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
实验要求
1. 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;
2. 完成实验、撰写实验报告,实验报告模板见QQ群,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);
3. 使用git进行代码提交,使用commit进行代码说明
4. 禁止抄袭
实验知识点
1.掌握客户端和服务器的相关知识,我的IP地址为192.168.199.181,齐力锋的IP地址为192.168.56.1
2.能够基于Java Socket实现客户端/服务器功能,传输方式用TCP
3 能够把用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器,并解密
实验步骤
1.实现中缀转后缀MyBC.java,并调用MyDC.java输出结果。
2.创建服务器,通过克隆网上的服务器代码,然后伙伴克隆客户端代码,修改代码,调用中缀转后缀,并输出值。由客户端输入中缀,服务器得到后缀,并给客户端输出结果。调用代码如下:
String line2 = in.readLine();
System.out.println(line2);
MyDC dc = new MyDC();
int result = dc.evaluate (line2);
System.out.println(result);
//在标准输出上打印从客户端读入的字符串
line=String.valueOf(result);
3.接收服务器对于后缀表达式的信息,通过3DES共同协商的密钥解密出答案,并发送答案到服务器。
Dncode dncode = new Dncode();
String line2 = in.readLine();
System.out.println(line2);
String encodeRules = "lxrqlf";
String content = line2;
System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+dncode.AESDncode(encodeRules, content));
MyDC dc = new MyDC();
int result = dc.evaluate (new String(dncode.AESDncode(encodeRules, content)));
System.out.println(result);
//在标准输出上打印从客户端读入的字符串
line=String.valueOf(result);
4.先生成两个人的公钥和私钥,最后通过KeyAgree.java算法得到共同的密钥,将密钥加入客户端和服务器,并运行。
5.客户端通过DigestPass将后缀表达式生成MD5值,服务器接收,并判断与自己的MD5值是否相等,若不相等则终止程序,关键代码如下:
Dncode dncode = new Dncode();
String line2 = in.readLine();
String line3 = in.readLine();
System.out.println("得到的MD5值为"+line3);
System.out.println("得到的密文为"+line2);
String encodeRules = "67,-78,48,-68,-9,63,41,-42,70,-109,24,74,97,-8,71,92,123,46,-80,-123,-100,-29,-120,49,-39,55,-100,-31,62,-46,39,42,-10,-126,-88,-59,-86,-22,67,-95,-81,-122,-107,114,-31,113,-17,110,26,122,-29,57,-27,-70,-67,40,-108,14,-17,8,1,-71,-93,-1,-22,-87,52,12,-29,61,-117,126,73,-69,-62,-48,-38,-128,7,77,95,-88,-22,88,-5,-55,-99,39,107,-128,67,-120,49,-127,-82,-12,-117,13,73,105,-45,118,122,1,-124,123,-18,65,47,-40,105,-30,111,51,13,-83,22,-89,114,-62,-55,98,-15,-8,40,36,37,-88,
";
String content = line2;
System.out.println("根据DH生成的密钥"+encodeRules+"解密后的明文是:"+dncode.AESDncode(encodeRules, content));
String x=dncode.AESDncode(encodeRules, content);
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8"));
byte s[ ]=m.digest( );
String result1="";
for (int i=0; i<s.length; i++){
result1+=Integer.toHexString((0x000000ff & s[i]) |
0xffffff00).substring(6);
}
if (!result1.equals(line3)) {
System.out.println("密文被篡改");
System.exit(0);
}
MyDC dc = new MyDC();
int result = dc.evaluate (new String(dncode.AESDncode(encodeRules, content)));
System.out.println(result);