20172313 2017-2018-2 《程序设计与数据结构》实验五报告

20172313 2017-2018-2 《程序设计与数据结构》实验五报告

课程:《程序设计与数据结构》
班级: 1723
姓名: 余坤澎
学号:20172313
实验教师:王志强
实验日期:2018年6月13日
必修/选修: 必修

1.实验内容

  • 实验一
  1. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA。
  2. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  3. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java。
  4. 上传测试代码运行结果截图和码云链接。
  • 实验二
  1. 注意责任归宿,要会通过测试证明自己没有问题。
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP。
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器。
  4. 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端。
  5. 客户端显示服务器发送过来的结果。
  6. 上传测试结果截图和码云链接。
  • 实验三
  1. 注意责任归宿,要会通过测试证明自己没有问题。
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP。
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器。
  4. 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端。
  5. 客户端显示服务器发送过来的结果。
  6. 上传测试结果截图和码云链接。
  • 实验四
  1. 注意责任归宿,要会通过测试证明自己没有问题。
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP。
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器。
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换。
  5. 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端。
  6. 客户端显示服务器发送过来的结果。
  7. 上传测试结果截图和码云链接。
  • 实验五
  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP。
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器。
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换。
  5. 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端。
  6. 客户端显示服务器发送过来的结果。
  7. 上传测试结果截图和码云链接。

2. 实验过程及结果

  • 实验一中用到的是之前四则运算中所写的代码所以并没有什么难度。

  • 实验二需要用到实现客户端和服务器功能,有老师给的代码作为参考,这一部分还是很顺利的完成。注意的是与结对伙伴在进行服务器和客户端的链接的时候要注意IP地址和端口的输入准确无误。

  • 实验三在实验二的基础上添加了对后缀表达式进行加密,对于这一部分的内容确实有些陌生,只是在原来的实验中大致的了解到了一些。好在娄老师的博客写的非常详细,用秘钥加密后传给结对伙伴再用相同的秘钥解密,用实验二中已经做好的部分进行求值。

  • 实验三使用相同的秘钥进行加解密,实验四又在实验三上做了改进,运用DH算法各自生成公钥和私钥,双方的公钥公开,私钥保留,只需用对方的公钥和自己的私钥组合而成的新的对称秘钥进行通信。

  • 对服务器向客户端传输加密后的数据后,客户端在收到以后还应检查信息是否完整,实验五在这里就用到MD5算法,使用Java计算指定字符串的消息摘要。

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

  • 问题一:实验二中提到,传输方式要用TCP,对TCP的认识不是很到位。

  • 问题一解决方案:当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。由于知识储备不足,还是不能很好的理解,在本文最后赋上详解博客地址。

  • 问题二:实验三中要求使用3DES或AES对密文进行加密,不理解3DES和AES分别代表什么意思。

  • 问题二解决方案:

DES算法的入口参数有三个:Key、Data、Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:
如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;
如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。

AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。
用AES加密2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的 AES。Rijndael是在1999年下半年,由研究员Joan Daemen 和 Vincent Rijmen 创建的。AES正日益成为加密各种形式的电子数据的实际标准。
美国标准与技术研究院(NIST)于2002年5月26日制定了新的高级加密标准(AES)规范。
AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。
AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。
与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

  • 问题三:在刚开始做实验二的时候,用客户端向服务器传输数据,总是提示connection reset的字样。

  • 问题三解决方案:在客户端可以打印出转换的后缀表达式字样,说明在客户端这里是没有问题的,那说明是服务器那边对数据不能进行预期的处理得到正确的结果。经过仔细的检查,发现服务器在经由计算后缀表达式求值这里出了问题。调用的方法中,计算后缀表达式所需的字符串数字与运算符之间是需要用空格分开的,对客户端转换的字符串进行处理,问题就得以解决了。

  • 问题四:在实验四使用AES算法对密文进行加密的时候
    ,需要用他人的公钥与自己的私钥进行组合形成新的对称秘钥,但AES所需的秘钥长度是128bytes,而形成的秘钥不满足这一要求,使得加解密无法继续进行。

  • 问题四解决方案:我最初的想法是想要对秘钥进行分割在进行截取,取前128位放到一个byte数组中,但不知道为什么,可能是因为我的操作失误,并没有成功。(由于当时心情比较急迫,想尽快把实验做好,忘记对问题的解决过程进行记录了。)上网查询了一下资料,发现在类库中是有对秘钥长度进行规定的这样一个方法的,于是我查询了API。按照API上给出的内容对代码进行更改就没有问题了!


其他

这次实验的内容是比较新的,跟以往相比显得有些难,也花费了我不少时间,同时也让我认识到自己不会的东西还有很多。对这次有关密码知识的学习也让我认识到密码工作事业的发展任重而道远。我们还需继续努力才行!

参考资料

posted @ 2018-06-19 16:39  银海、  阅读(206)  评论(0编辑  收藏  举报