实验四

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

课程:《程序设计与数据结构》
班级: 1823
姓名: 姬旭
学号: 20182334
实验教师:王志强
实验日期:2019年9月30日
必修/选修: 必修

1.实验内容

(一)Java Socket编程

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

(二)Java和密码学

参考 http://www.cnblogs.com/rocedu/p/6683948.html

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

(三)编写有理数/复数计算器

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

(四)远程有理数计算器

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

(五)远程复数计算器

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

2. 实验过程及结果

本次实验实现远程连接,通过两台pc机实现聊天或者运算。

(1)Java Socket编程

本实验是和结对伙伴一起做的,首先实现连接,然后传送信息。

下图是服务器收到的信息:

下图是客户端收到服务器的信息:

(2)Java和密码学

本实验总共分为五步分:

凯撒密码
下图程序既可用于加密也可以用来解密。只要执行


java 文件名 明文(要加密的字符串) 密钥(移动的位数)


即加密完成。
在密钥前加上负号,运行


java 文件名 明文(要加密的字符串) -密钥(移动的位数)


即可解密。


Java对称加密-DES算法

(一)

运行下图则会生成文件key1.dat,其中包含的密钥可以用于使用Triple-DES算法的加密和解密。

上面的示例将密钥通过对象序列化方式保存在文件中,在文件中保存的是对象,本实例以另一种方式保存在文件中,即以字节保存在文件中。

(二)

程序中在保存了密钥编码后,又使用循环语句将字节数组中的内容打印出来。这样可以较为直观地看到密钥编码的内容。

(三)

屏幕中输出的数字:其中第一行为字符串"Hello World!"的字节数组编码方式,第二行为加密后的内容,第二行的内容会随着密钥的不同而不同。

密文同时保存在SEnc.dat文件中,将其提供给需要的人时,需要同时提供加密时使用的密钥(key1.dat,或keykb1.dat),这样收到SEnc.dat中密文的人才能够解密文件中的内容。
前面加密后的密文SEnc.dat,以及加密时所使用的密钥key1.dat或keykb1.dat,本实例对SEnc.dat中的密文进行解密,得到明文。

(四)

运行程序

当前目录下必须有前面生成的密钥文件keykb1.dat,以及密文文件SEnc.dat。
输入java SDec运行程序,将输出明文字符串“Hello World!”。

Java非对称加密-RSA算法

(一)

输入java Skey_RSA运行程序,当前目录下将生成两个文件:Skey_RSA_pub.dat和Skey_RSA_priv.dat,前者保存着公钥,后者保存着私钥。

(二)

输入java Enc_RSA运行程序,得到如下结果:

其中显示了公钥中的参数以及加密的结果c,这些都是很大的整数,n和c多达上百位。程序运行后密文c以字符串形式保存在文件Enc_RSA.dat中。

(三)

运行程序输入java Dec_RSA运行程序,得到如下结果

其中显示了私钥中的参数以及解密的结果,其中整型的明文转换后显示出字符串“Hello World!”。

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

  • 创建DH公钥和私钥

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

首先由A创建自己的公钥和私钥,即在A目录下输入


java Key_DH Apub.dat Apri.dat


运行程序,这时在目录A下将产生文件Apub.dat和Apri.dat,前者保存着A的公钥,后者保存着A的私钥。
然后由B创建自己的公钥和私钥,即在B目录下输入


java Key_DH Bpub.dat Bpri.dat


运行程序,这时在目录B下将产生文件Bpub.dat和Bpri.dat,前者保存着B的公钥,后者保存着B的私钥。

最后发布公钥,A将Apub.dat拷贝到B目录,B将Bpub.dat拷贝到A的目录。
这样,A、B双方的DH公钥和私钥已经创建并部署完毕。

将程序KeyAgree编译后分别拷贝在A和B两个目录,首先在A目录输入


java KeyAgree Bpub.dat Apri.dat


运行程序,它使用文件Bpub.dat中对方的公钥和文件Apri.dat中自己的私钥创建了一段共享的字节数组。

Java摘要算法- MD5

输入


java DigestCalc abc


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

(3)编写有理数/复数计算器

结对对象写复数计算器,我写有理数计算器,



(4)远程有理数计算器

在有理数计算器中,写了Rational类,script类,之后嵌套连接,最后互相传输信息。

(5)远程复数计算器

在复数计算器中 ,传输信息,编写hello类,完成信息处理。

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

  • 问题1:在实验一中,无论怎样都无法连接对方,很头疼。

  • 问题1解决方案:利用cmd命令查找本机ip地址

再用ipconfig命令查找ip

  • 问题2:按照问题一的方法找了ip地址,但输上去还是不管用,

  • 问题2解决方案:仔细观察cmd命令发现自己找的是以太网的ip地址,但电脑没有连网线,而是连的WiFi,找到无线局域网的ip地址之后再连接就OK啦

  • 问题3:无法打出printl。

-问题3解决方案:一开始我以为是没有class文件,因为以前就遇到过这种问题,但我仔细看有class,于是和迷茫,询问结对伙伴才知道自己多打了个括号:

  • 问题4:在写第二个实验的时候总是出现以下问题:

很棘手,也不知如何解决。

  • 问题4解决方案:找助教学姐问了问,得到的回答是需要在命令行调试的地方输入值,这里引用个博客:IDEA如何输入命令行参数,完美的解决了我的问题

  • 问题5:不明白以下代码的含义:


outputStreamWriter.write(info1);
outputStreamWriter.flush();
outputStreamWriter.write(info2);
outputStreamWriter.flush();
outputStreamWriter.write(s);
outputStreamWriter.flush();
scoket.shutdownOutput();



info1 = bufferedReader.readLine();


其中的bufferedReader我不明白

其他(感悟、思考等)

这个实验颠覆了我对自学的看法,说起自学很简单,但操作起来,是真的要命,无论是遇到自己见都没见过的知识点,还是自己要动手敲一个很棘手的代码,都困难重重,这个实验我和结对伙伴打了将近3天,才基本处理完毕,还有很多不足没有改进,代码中的漏洞也还很多,在实验完成后还要继续修正,修复bug。自己要学的东西还有很多,自己面临的知识盲区也无穷无尽,每多打一部分代码,就会发现自己原来知道的是那么少,九牛一毛都觉得多。随着学习的深入,懂得越多,但又发现自己懂的是那么的少,产生矛盾。

参考资料

原文地址:https://www.cnblogs.com/cistineup/p/11630412.html