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


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

    课程:《程序设计与数据结构》
    班级: 1723
    姓名: 郭恺
    学号: 20172301
    实验教师:王志强老师
    助教:张旭升/刘伟康
    实验日期:2018年6月18日
    必修/选修: 必修

    1.实验内容

    • 实验1:

      • 结对实现中缀表达式转后缀表达式的功能 Convert.java(我们小组的中缀转后缀的类名)
      • 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用Comparision.java
      • 上传测试代码运行结果截图和码云链接
    • 实验2:

      • 客户端让用户输入中缀表达式,然后把中缀表达式调用Convert.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
      • 服务器接收到后缀表达式,调用Comparision.java的功能计算后缀表达式的值,把结果发送给客户端
      • 客户端显示服务器发送过来的结果
      • 上传测试结果截图和码云链接
    • 实验3:

      • 客户端让用户输入中缀表达式,然后把中缀表达式调用Convert.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
      • 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用Comparision.java的功能计算后缀表达式的值,把结果发送给客户端
      • 客户端显示服务器发送过来的结果
      • 上传测试结果截图和码云链接
    • 实验4:

      • 客户端让用户输入中缀表达式,然后把中缀表达式调用Convert.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
      • 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
      • 服务器接收到后缀表达式表达式后,进行解密,然后调Comparision.java的功能计算后缀表达式的值,把结果发送给客户端
      • 客户端显示服务器发送过来的结果
      • 上传测试结果截图和码云链接
    • 实验5:

      • 客户端让用户输入中缀表达式,然后把中缀表达式调用Convert.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
      • 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
      • 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用Comparision.java的功能计算后缀表达式的值,把结果发送给客户端
      • 客户端显示服务器发送过来的结果
      • 上传测试结果截图和码云链接

    2. 实验过程及结果

    • 实验1:之前的四则运算项目已经实现了。不多阐述。.

    • 截图:

    • 实验2:

      • 实验2的重点主要在于客户端和服务器如何相连接。
      • 根据老师提供的代码,只要通过Scanner类添加一个用户输入的进程就好了。在把结果传回客户端。
       String suffix = bufferedReader.readLine();
          if(suffix!=null){
              System.out.println("后缀表达式计算结果是" + sofo.calculator(suffix));
          }
      
          String result = "后缀表达式计算结果是" + sofo.calculator(sofo.calculator(suffix));
          //给客户一个响应
          String reply=result;
          printWriter.write(reply);
          printWriter.flush();
      
    • 截图:

    • 实验3:需要结合实验三的密码学相关知识。

      • 首先,是密钥。开始确实是我想复杂了。
      • 初始思路:在客户端里生成密钥,然后输出。复制粘贴到服务器的代码中进行解密。(详见问题解决)
      • 第二次思路:在服务器生成密钥,然后运行输出。运行客户端。通过Scanner类输入密钥。
      • 第三次思路:独立运行生成密钥,生成key1.dat和keykb1.dat文件。然后分别运行服务器和客户端。
    • 截图:

    • 实验4:分别运行key_DH.java和KeyAgree.java文件。注意输入命令行参数。命令行参数分别对应着生成公钥和私钥的文件名。 IDEA下命令行参数的输入之前也有用过。

    • 截图:

    • 实验5:分别在服务器和客户端当中粘贴MD5算法,然后在服务器中进行计算。

     String x = p;//用x代表解密后的密文,也就是我们需要计算的字符串。
            MessageDigest m= MessageDigest.getInstance("MD5");
            m.update(x.getBytes("UTF8"));
            byte s[ ]=m.digest( );
            String result="";
            for (int i=0; i<s.length; i++){
                result+=Integer.toHexString((0x000000ff & s[i]) |
                        0xffffff00).substring(6);
            }
            System.out.println("MD5: " + result);
    
    • 截图:

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

    • 问题1:部分同学的IDEA无法输入命令行参数,即打开Run>Edit configurations中右半边是一片空白。
    • 问题1解决方案:这个应该是IDEA汉化之后的问题。 删除对应目录下的汉化包即可。

    唉,当初汉化是为了减少麻烦,没想到,还是逃不掉。

    • 问题2:实验三相关思路的挣扎。
    • 问题2解决方案:
      • 首先,在第一次的时候,我就想怎么把文件从服务器通过网络传给客户端。但是,我们并不知道如何操作。所以我就想不使用文件。通过数组形式来传递密钥。
      • 第一个思路就是在客户端里生成密钥,然后输出。复制粘贴到服务器的代码中进行解密。
      • 然后,我们发现了第一个问题。在运行代码时,要先运行服务器,然后才能运行客户端。 所以不能再客户端里生成密钥。
      • 第二个思路,把生成密钥放到服务器中,在客户端中通过Scanner类输入密钥。
      • 然后,我们遇到了第二个问题,密钥输出不出来
      • 没办法,最后还是通过生成文件,然后通过QQ来传送文件。确实有点南辕北辙的意味...
    • 问题3:在进行实验3的时候,遇到了这样一个问题。如图:

    我们可以看出来这个SecretKeySpec类无法转换成Key类
    我们查一下API:

    可以看出来是转换发生了问题。我突然发现在当前文件夹下有一个java文件名叫做Key

    恍然大悟。

    问题4:在运行的时候,遇到了一个问题无法解决。

    我修改了密钥长度和算法,可是依然报错。还在寻找解决方法。

    其他(感悟、思考等)

    这次的实验主要是和之前的实验三密码学进行结合,很多同学在学习密码学的时候,觉得生涩难懂。等到书到用时方恨少。 其实,每一步的学习都是靠自己。自己选择了什么,最后就会收到什么样的回报。
    愿我们能努力到无能为力。

    参考资料

  • 相关阅读:
    ASP.NET使用Coolite.Ext.Web.dll,显示ext"未定义"的解决方法
    浏览器引擎模式与DOCTYPE
    MVC 参数如何自动绑定数组对象
    IIS7.5 配置 PHP
    TFSDeleteProject:删除团队项目
    自动生成存储过程一
    如何更新ntext字段信息
    清除所有默认样式的CSS代码
    自定义动作过滤器属性
    IE9点击别的网页弹出空白页
  • 原文地址:https://www.cnblogs.com/gk0625/p/9201082.html
Copyright © 2020-2023  润新知