课程:《程序设计与数据结构》
班级: 1723
姓名:王禹涵
学号:20172323
实验教师:王志强
实验日期:2018年6月18日
必修/选修: 必修
1.实验内容
网络编程与安全-1
参考
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
网络编程与安全-2
一人负责客户端,一人负责服务器
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
网络编程与安全-3
加密结对编程:一人负责客户端,一人负责服务器
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
网络编程与安全-4
密钥分发结对编程:1人负责客户端,一人负责服务器
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
网络编程与安全-5
完整性校验结对编程:1人负责客户端,一人负责服务器
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
2. 实验过程及结果
exp1
- 代码链接
- 大概是很久没编写过代码,做这一步实验的时候就非常的迷,不知道老师给的中缀转后缀和后缀运算的类如何加到test文件中去。其实就用一个
MyBC xxx = new MyBC
,然后再通过xxx调用MyBC的方法就可以了。 - 实验运行截图
exp2
- 代码链接
- 做这一步的时候就出现了一点小问题,就是我只能作为服务器接受来自客户端的信息但是我并不能转化方式称为客户端发送信息给服务器
//1.建立一个服务器Socket(ServerSocket)绑定指定端口 ServerSocket serverSocket=new ServerSocket(8800); //2.使用accept()方法阻止等待监听,获得新连接 Socket socket=serverSocket.accept(); //3.获得输入流 InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); //获得输出流 OutputStream outputStream=socket.getOutputStream(); PrintWriter printWriter=new PrintWriter(outputStream);
以上代码是建立服务器和获得来自客户端信息的代码//1.建立客户端Socket连接,指定服务器位置和端口 Socket socket = new Socket("172.16.43.134",8800); //2.得到socket读写流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //输入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
客户端的代码
- 查看IP地址的方法除了
ipconfig
或者ifconfig
外,也可以直接再无线网的属性里面查看 - 实验运行截图
结对对象20172314,这里直接用的她的截图
exp3
- 代码链接
- 这一步花了许久的时间,最开始和结对伙伴进行互相传输就遇到了许多的困难,我们想到的方法是直接将密钥通过聊天软件传输然后复制到服务器代码上~后来无论如何密钥在传输过程中好像都出现了受损的情况。运行的时候总会出现各种问题,而且网上的方法基本都解决不了,还有一个要求是输入的式子长度必须是8的倍数等等等等恶心的错误。所以最后我们就放弃,选择自己和自己链接,虽然一开始也出现了问题,就是报错说密钥的错误,后来我发现启动服务器客户端前需要运行
Key_DES
和Key_kb
生成新的密钥文件 - 实验运行截图
exp4
- 代码链接
- 反正做每一步都会遇到一些解决不了的问题,这一步在运行DH算法文件的时候就出现了问题,报错显示
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
,应该写java KeyAgree Bpub.dat Apri.dat
命令的地方又是一片灰,反正写入不了。难道快结课了IDEA也罢工了?最后只有在别人的电脑上完成,还好没遇到更多的问题 - 实验运行截图
exp5
- 代码链接
- 这一步也是在别人的电脑上做的,或许我可以考虑换电脑了
- 实验运行截图
3. 实验过程中遇到的问题和解决过程
问题:实验三自己和自己连接的时候遇到系统提示报错说DES密钥错误
问题解决方案:启动服务器客户端前需要运行Key_DES
和Key_kb
生成新的密钥文件,这样运行才可以成功,但是原理不太懂
其他
这是本学期最后一个实验,也是本课程的最后一个任务了,我的电脑似乎比我更加迫切地想结束这一切了。这个实验也是五个实验中最有难度的一个,如果没有别人的帮助我估计一个人很难完成,这其中有借鉴学长学姐的代码经验,也有同学和助教特别细心和热心地帮助我修改代码处理运行中的问题,虽然有些问题到最后也没有得到解决,但这也无关大碍了。
参考资料
《Java程序设计与数据结构教程(第二版)》
《Java程序设计与数据结构教程(第二版)》学习指导