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:在运行的时候,遇到了一个问题无法解决。

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

其他(感悟、思考等)

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

参考资料

posted @ 2018-06-19 21:24  奈何明月ઇଓ  阅读(166)  评论(0编辑  收藏  举报
页尾