实验3报告
学号 20182329 2019-2020-1 《数据结构与面向对象程序设计》实验3报告
- 课程:《程序设计与数据结构》
- 班级: 1823
- 姓名: 李一卓
- 学号:20182329
- 实验教师:王志强
- 实验日期:2019年9月30日
- 必修/选修: 必修
1.实验内容
- 首先学习Java Socket的编程,后面实验45都要用到,来传递数据。
- 学习凯撒密码的使用方法
- 学习Java密码的DES算法和RSA算法还有HD算法
- 编写简单计算器(有理数计算器)。
- 使用试验1里面的方法和实验三代码,编写客户端,客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。
2. 实验过程及结果
-
先进行Java Socket的编程,copy老师的代码,可以自己改变服务端和客户端的输出字符,最重要的是吧IP地址改到结对伙伴的地址上,连接同一个网络。运行如下:
-
学习凯撒密码的编译,凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。凯撒密码的加密过程可记为如下一个变换:c≡m+k mod n(其中n为基本字符个数),如图:
-
再然后学习DES算法,首先要生成密钥,分为几部: 获取密钥生成器, 初始化密钥生成器,生成密钥,通过对象序列化方式将密钥保存在文件中。如图:
-
生成密钥后,生成Java中所有的密钥类都有一个getEncoded( )方法,通过它可以从密钥对象中获取主要编码格式,其返回值是字节数组。如图:
-
设置完方法后,首先要从文件中获取已经生成的密钥,然后考虑如何使用密钥进行加密。这涉及到各种算法。Java中已经提供了常用的加密算法,我们执行Java中Cipher类的各个方法就可以完成加密过程。如图:
然后就是使用密钥加密了,如图:
- 然后我们要学习RSA算法的加密方法,和DES类似,要生成公钥,和私钥,在执行加密和解密。如图:
-
学习使用密钥协定创建共享密钥,首先创建DH公钥和私钥,在创建共享密钥,如图:
-
学习使用Java计算指定字符串的消息摘要。如图:
-
自己编写有理数计算器。
-
结对伙伴编程实现客户端,我实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给服务器端,服务器端根据字符串计算出结果为5/12,并把结果返回给客户端,收到结果后输出结果。 -
和复数计算器一样
客户端通过键盘输入一个复数计算的公式,并把该公式以字符串的形式发送给伙伴服务器,服务器端根据字符串计算出结果,并把结果返回给客户端,收到结果后输出结果。
3. 实验过程中遇到的问题和解决过程
-
问题1:在使用使用密钥协定创建共享密钥时,发现创建的公钥私钥无法使用,运行如下图:
-
问题1解决方法:建立两个目录A和B,模拟需要秘密通信的A、B双方,由于DH算法需要A和B各自生成DH公钥和私钥,因此在这两个目录下都拷贝编译后文件Key_DH。而我则是直接在同一个目录下运行两个程序。所以首先由A创建自己的公钥和私钥,然后由B创建自己的公钥和私钥,最后发布公钥,A将Apub.dat拷贝到B目录,B将Bpub.dat拷贝到A的目录。
-
问题2:在编写凯撒密码的4函数时,发现运行不了,我将明文和加密方法直接输入时不能加载,如图:
-
问题2解决方法:密钥的解密加密是在Exit的方法栏里找到Progiamarguments里面进行输入的。
其他(感悟、思考等)
在学习中,理解了客户端和服务端的之间的联系,在学习使用java密钥的方法时,必须将密钥和文件的编写分为两个方面,密钥的编写完成后的功能,决定了后面明文的健米方式,而且不同的算法会有你不同的加密解密方式,网络数据传递的是我们将来java实用化的第一步。