20172305 2017-2018-2 《程序设计与数据结构》实验五报告
课程:《程序设计与数据结构》
班级: 1723
姓名: 谭鑫
学号:20172305
实验教师:王志强
实验日期:2018年6月13日
必修/选修: 必修
1.实验内容
-
实验五 网络编程与安全-1:两人一组结对编程
- 参考
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
- 上传测试代码运行结果截图和码云链接
- 实验五 网络编程与安全-2:结对编程:一人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
- 实验五 网络编程与安全-3:加密结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
- 实验五 网络编程与安全-4:密钥分发结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
- 实验五 网络编程与安全-5:完整性校验结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
2. 实验过程及结果
-
(1)网络编程与安全-1:测试MyBC和MyDC的代码,但是老师说可以用之前各组编写的四则运算的代码,所以我用的是我们组的中缀转后缀和计算结果的两个方法进行测试的。
-
(2)网络编程与安全-2:在证明自己电脑与别的电脑连接不上的前提下,我使用虚拟机替代另一台电脑进行的传输,通过客户端输入的中缀表达式,转换成后缀表达式在传输到服务端进行计算。最最重要的一部分就是端口和IP一定要注意写对!!
- 客户端
- 服务端
- 客户端
-
(3)网络编程与安全-3:开始加密传输,在客户端将后缀表达式进行加密传输,到服务器端进行解密计算,然后在传回来。最困难的部分就是进行密钥的传输,在下面遇到的问题和解决办法中具体详述。
- 客户端
- 服务端
- 客户端
-
(4)网络编程与安全-4:运用DH算法进行加解密,先要理解双方的产生的两个密钥,再把公钥相互传输过去,通过两个密钥产生终极密钥进行加密和解密。
- 客户端
- 服务端
- 客户端
-
(5)网络编程与安全-5:客户端传输密文和MD5,然后在服务端产生MD5,将两个MD5进行对比,如果不对则说明传输过程中有缺失和篡改,对的话则说明传输过程中没问题。这样的话,再通过DH算法进行加密的话,增强了传输过程中的安全性。
- 客户端
- 服务端
- 客户端
3. 实验过程中遇到的问题和解决过程
-
问题1:密钥的传输问题
-
问题1的解决方案:前两个实验没有加密,做起来还是比较顺手的。实验三感觉是一个分水岭。传输的过程需要带着密钥,但是将密钥通过QQ和微信传过去会有损失。想将密钥和密文以字符串的形式传输的话,在服务器上始终断不开,准备将密钥放到密文的字节数组里,再从服务端接收数组,从数组中扣除密钥的部分。
-
问题2:MD5的问题
-
问题2的解决方案:这个MD5在实验三的练习过程中就每太懂,知识按照娄老师的博客中的要求进行练习,之前偷过的懒之后都得补回来...所以,找度娘查到MD5类似一种数字签名,利用传输信息形成MD5(一串消息摘要),通过网络传输过去,接收方通过解密接受过来的信息并生成对应的MD5,通过传过来的和接收方生成的进行对比,如果一直则没有被篡改,不一致就说明在传输过程中被修改了。
-
问题3:Wrong Key Size
-
问题3的解决方案:密钥长度受限制,java运行时环境读到的是受限的policy文件。但是,我在按照网上的解决办法进行解决,在替换${jdk_home}/jre/lib/security目录下的 local_policy.jar 和 US_export_policy.jar 文件之后,却并无卵用...侯大哥给我加了一个一句话
SecretKeySpec k =new SecretKeySpec(sb,"DESede");
就可以解决。 -
问题4:DataOutputStream和DataInputStream
-
问题2的解决方案:这部分是在实验四遇到的问题。查到的代码可以实现实验四,但是不是很懂代码的含义。
- writeUTF(String str)以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
- DataOutputStream,数据输出流允许应用程序以适当方式将基本Java数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
- DataInputStream,数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
其他
实验五就是不断的在两台电脑之间传输信息,显示明文传输到后来的密文传输,一个密钥到两个密钥的加密,还有MD5的传输。在练习的过程中遇到了很多关于密码的问题,也学习很多关于IO流的问题。