20172322 2017-2018-2 《程序设计与数据结构》实验五报告
- 课程:《程序设计与数据结构》
- 班级: 1723
- 姓名: 张昊然
- 学号:20172322
- 实验教师:王志强
- 助教:张旭升/刘伟康
- 实验日期:2018年6月13日
- 必修/选修: 必修
1.实验内容
- 此处填写实验的具体内容:
参考《实验五》
本次实验总共五个提交节点:
1.两人一组结对编程:
- 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 结对实现中缀表达式转后缀表达式的功能
MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用
MyDC.java
- 上传测试代码运行结果截图和码云链接
2.结对编程:1人负责客户端,一人负责服务器
- 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用
MyDC.java
的功能计算后缀表达式的值,把结果发送给客户端 - 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
3.加密结对编程:1人负责客户端,一人负责服务器
- 注意责任归宿,要会通过测试证明自己没有问题
- 基于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.实验过程及结果
过程:
- 本次实验总共五个提交点。我也分为五个部分来写过程。
- 第一:因为我们在结对编程项目——四则运算中已经写好了中缀转后缀和计算,故没有使用
MyBC.java
,利用了自己写好的InfixToSuffix
和Calculator
在main函数中加入了一个语句System.out.println(its.getMessage());
输出了后缀表达式。(求值在之前已经实现) - 第二:因为
Java Socket
方法老师在课上已经讲过我们只是稍作修改后分别调用了InfixToSuffix
和Calculator
于客户端和服务器端,后缀表达式由客户端传给服务器端,服务器端传回计算结果。 - 第三:参考了娄老师的博客加上在实验三的时候已经初步接触过DES加密算法。在节点二的基础上对后缀表达式进行了加密,并且通过公用网络传输了密钥,使得客户端和服务器端的密钥一致。
- 第四:修改了实验三中的
Key_DH
和KeyAgree
,使其不需要使用命令行参数,而在main函数中直接实现,并且残生了新的公共密钥sb.dat
在两边均可显示。 - 第五:在节点四的基础上修改了
DigestPass
变命令行参数为main函数,并且加入了对MD5
值的验证,以验证信息是否被篡改,客户端和服务器端分别两次发送和接受信息,一次是节点四的内容,第二次是MD5
值,并且服务器端也根据结果算出了MD5
的值,最后作对比,如果一致说明信息没被篡改,反之亦反。
- 第一:因为我们在结对编程项目——四则运算中已经写好了中缀转后缀和计算,故没有使用
结果:
1.
2.
3.
4.
5.
3.实验过程中遇到的问题和解决过程
- 问题1:最初不太理解DH算法原理。
- 问题1解决方案:在看过王老师发的一张图
和看了娄老师的博客后了解一些。
- 问题2:因为在娄老师的博客中使用了命令行参数,而我的IDEA因为汉化和不方便的原因无法使用IDEA,又被困于如何修改命令行参数为main函数。
- 问题2解决方案:在网上参看了一篇博客Main函数和命令行参数复习了一下命令行参数和main函数的知识,并且和结对小伙伴一起修改了
Key_DH
和KeyAgree
,最终完成了这个任务。 - 问题3:出现了
java.io.EOFException
和```javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
- 问题3解决方案:最后小伙伴**突然提出,是不是密钥的问题?**然后...真的是啊是啊是啊是啊。最后再次交换了一波密钥之后就没有问题了。。。
### 其他(感悟、思考等)
#### 感悟
- 虽然我们的专业最终可能对于本次实验涉及的方面不会再深入的研究,但是培养一些兴趣固然是好的。
- 我的结对伙伴果然是个厉害的小伙伴!
### 参考资料
- [Main函数和命令行参数](https://blog.csdn.net/yechaodechuntian/article/details/11768113)
- [娄老师的博客](http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA)
- [《实验五》](https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1981)