结对实验 20162315-20162317 网络编程与安全

实验项目

  • 1.结对实现中缀表达式转后缀表达式的功能 MyBC.java,结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java。
  • 2.1人负责客户端,一人负责服务器。
    注意责任归宿,要会通过测试证明自己没有问题。
    基于Java Socket实现客户端/服务器功能,传输方式用TCP。
    客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器。
    服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端。客户端显示服务器发送过来的结果。
  • 3.在以上基础上,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器。
  • 4.在以上基础上,客户端和服务器用DH算法进行3DES或AES算法的密钥交换。
  • 5.在以上基础上,用MD5在客户端和服务器上分别对后缀表达式进行加密,客户端发送给服务器的MD5的值与服务器自行计算值一致时才执行服务器的计算。

实验过程

  • 1.MyBC.java与MyDC.java这两个类分别写入了后缀表达式的计算方法和中缀表达式转化为后缀表达式。这两个类我们在四则运算中已经实现了,因此只需要再写一个驱动类进行调用。
  • 2.我负责Client。我们使用了一个完善的网上的客户端服务器代码。在建立服务器与客户端连接时我们出现了问题,不断出现connec refused。上网查询,检查ip地址无误和端口一致后我们认为是端口被占用,无法使用,更换了几次之后完成了连接。在客户端第一次输入值的命令下我调用了MyDC的方法,使得输入的str转换为后缀表达式并且输出给服务器。
  • 3.这项任务中要求对输出的后缀表达式使用AES或者3DES算法(对称算法)进行加密,我们首先输入了AES加密算法的一个类。

  • 在客户端代码中,我调用了这个类中的方法,对后缀表达式进行了加密。

    设置一个变量content(明文内容)=上面转化后的后缀表达式的值。这是加入DH算法后的代码,加入前密码是用scanner方法手动输入的。
  • 4.这一项目里加入了DH算法进行秘钥交换。我们使用了上次java密码学的DH算法的代码。在生成各自的pub和pri秘钥后,我们交换了各自的公钥,利用Key_Agree生成了公共密钥。在这一步我们遇到了苦难。因为key_Agree是将秘钥以byte数组的形式打印出来的。但是我们想要的是能代入进代码的str类型。两者不能强制转换。后来我们将byte数组打印成char数组保存在一个叫做Shared_key.txt的文本文件中。再将这个文件读到客户端和服务器中去。虽然文本文件里储存的char格式的公共密钥是乱码,但不影响客户端和服务器生成的公共密钥的一致性。

  • 5.在后缀表达式生成后我们用MD5的加密方法对它进行了一次加密并且传给了服务器。这次实验中我们存在一个问题。MD5与后缀表达式用AES加密后的密文一起传过去时,系统是无法辨别哪一行是密文的,都进行了解密,于是袁逸灏的客户端无法正常解密,只能出现MD5的值。后来我们想到了readline()每次只读一行。如果我们一次性从客户端上把信息读过去,在读每一行时进行处理再读下一行应该就能解决问题。袁逸灏尝试了一遍便成功了。

体验与收获

这次结对实验中,我们体验与感受了java密码学算法的神奇之处。尤其是实现DH非对称算法利用两把密钥进行加密时,我们感觉到了一种惊喜。这些从前认为很高级的算法,在自己接触后发现虽然自己写出这样的算法很难,但是运用它并不难,而且确实也很实用。

代码链接

客户端
服务器

posted @ 2017-06-11 20:19  162315  阅读(93)  评论(0编辑  收藏