20192309 2019-2020-1 《数据结构与面向对象程序设计》实验四报告

20192309《数据结构与面向对象程序设计》实验四报告

课程:《程序设计与数据结构》
班级: 1923
姓名: 金一非
学号:20192309
实验教师:王志强
实验日期:2020年10月22日
必修/选修: 必修

1.实验内容

(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。

(二)Java和密码学
以结对的方式完成Java密码学相关内容的学习。提交学习成果码云链接和代表性成果截图,要有学号水印。

(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。

(四)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。

(五)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!

2. 实验过程及结果(本次实验由我(A)与20192316(B)结对完成)(加分项:在实验4、5中实现客户端加密传输,服务器解密反馈)

实验1.java socket编程

编写服务器:

编写客户端:

实验2 Java和密码学

相关内容:
开发一个程序时,最好的方法就是将对象想象为“服务提供者”,程序通过调用若干对象提供的服务来实现预期目标。
密码学: 主要是研究保密通信和信息保密的学科, 包括信息保密传输和信息加密存储等。
密码编码学: 主要研究如何对信息进行编码, 如何实现对信息的隐蔽, 是密码学理论的基础, 也是保密系统设计的基础。
密码分析学: 主要研究加密消息的破译或消息的伪造, 是检验密码体制安全性最为直接的手段, 只有通过实际密码分析考验的密码体制,才是真正可用的。
对称密码(symmetric cryptography)是指在加密和解密时使用同一密钥的方式。
公钥密码(public-key cryptography)则是指在加密和解密时使用不同密钥的方式,公钥密码又称为非对称密码(asymmetric cryptography)。

2.1 凯撒密码

凯撒密码的加密算法极其简单。其加密过程如下:
我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
代码及运行结果如下:

2.2 Java对称加密-DES算法

运行java Skey_DES,在当前目录下将生成文件key1.dat
结果如下:

程序中在保存了密钥编码后,又使用循环语句将字节数组中的内容打印出来。这样可以较为直观地看到密钥编码的内容。
运行程序
输入java Skey_kb 运行程序,在程序的当前目录中将产生文件名为keykb1.dat的文件,屏幕输出如下:
11,-105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,67,-88,59,-71,55,-125,104,42,

输入java SEnc运行程序,在程序的当前目录中将产生文件名为SEnc.dat的文件,屏幕输出如下:

输入java SDec运行程序,将输出明文字符串“Hello World!”

2.3 Java非对称加密-RSA算法

输入java Skey_RSA运行程序,当前目录下将生成两个文件:Skey_RSA_pub.dat和Skey_RSA_priv.dat,前者保存着公钥,后者保存着私钥。将文件Skey_RSA_pub.dat对外公布(如放在Web服务器上给大家下载,或者直接拷贝给所有需要的人),而Skey_RSA_priv.dat秘密保存。

输入java Enc_RSA运行程序,得到如下结果:
其中显示了公钥中的参数以及加密的结果c,这些都是很大的整数,n和c多达上百位。程序运行后密文c以字符串形式保存在文件Enc_RSA.dat中。
下面实例使用私钥文件Skey_RSA_priv.dat,对密文文件Enc_RSA.dat进行解密。

运行程序输入java Dec_RSA运行程序,得到如下结果:
其中显示了私钥中的参数以及解密的结果,其中整型的明文转换后显示出字符串“Hello World!”。

2.4 使用密钥协定创建共享密钥

运行程序:
建立两个目录A和B,模拟需要秘密通信的A、B双方,由于DH算法需要A和B各自生成DH公钥和私钥,因此在这两个目录下都拷贝编译后文件Key_DH。

2.5Java摘要算法- MD5

运行程序
输入java DigestCalc abc来运行程序,其中命令行参数abc是原始数据,屏幕输出计算后的消息摘要:900150983cd24fb0d6963f7d28e17f72。

实验3 编写有理数/复数计算器

本人编写的是有理数计算器
代码及运行结果如下:

实验4 远程有理数计算器(具有加密解密功能(加分项))

服务器:

客户端:

实验5 远程复数计算器(具有加密解密功能(加分项))

服务器:

客户端:

3. 实验过程中遇到的问题和解决过程

问题1:使用宿舍或公共的的局域网我的服务器无法和伙伴的客户端连接不上。
问题1解决方案:使用自己的手机热点
问题2:在有理数的运算下,无法直接读取分数。
问题2解决方案:利用Stringtokenizer类,Stringtokenizer类可用来分割字符串,在处理字符串转化的时候可用于定义运算符及小括号为分隔符进行字符串的拆分。这样就可以把分数看作是一个字符数调取它的分子和分母,是只能进行计算器的计算。

其他(感悟、思考等)

通过这次试验初次接触到数据结构,对我而言是不小的收获。还是希望自己能调整好时间,跟上老师的进度。

posted @ 2020-10-30 19:31  哈蛤蛤哈  阅读(136)  评论(0编辑  收藏  举报