实验五 网络编程与安全

Java面向对象程序设计

实验内容

  • 完成MyBC.java,实现输入中缀表达式,转为后缀表达式并计算结果
  • 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十二章, 基于Java Socket实现客户端/服务器功能,客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器,服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器,服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器,客户端和服务器用DH算法进行3DES或AES算法的密钥交换,服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端,客户端显示服务器发送过来的结果

实验要求

1. 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;

2. 完成实验、撰写实验报告,实验报告模板见QQ群,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);

3. 使用git进行代码提交,使用commit进行代码说明

4. 禁止抄袭

实验知识点

1.掌握客户端和服务器的相关知识,我的IP地址为192.168.199.181,齐力锋的IP地址为192.168.56.1

2.能够基于Java Socket实现客户端/服务器功能,传输方式用TCP

3 能够把用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器,并解密

实验步骤

1.实现中缀转后缀MyBC.java,并调用MyDC.java输出结果。

2.创建服务器,通过克隆网上的服务器代码,然后伙伴克隆客户端代码,修改代码,调用中缀转后缀,并输出值。由客户端输入中缀,服务器得到后缀,并给客户端输出结果。调用代码如下:

   String line2 = in.readLine();
            System.out.println(line2);
            MyDC dc = new MyDC();
            int result = dc.evaluate (line2);
            System.out.println(result);

            //在标准输出上打印从客户端读入的字符串
            line=String.valueOf(result);

3.接收服务器对于后缀表达式的信息,通过3DES共同协商的密钥解密出答案,并发送答案到服务器。

  Dncode dncode = new Dncode();
            String line2 = in.readLine();
            System.out.println(line2);
            String encodeRules = "lxrqlf";
            String content = line2;
            System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+dncode.AESDncode(encodeRules, content));
            MyDC dc = new MyDC();
            int result = dc.evaluate (new String(dncode.AESDncode(encodeRules, content)));
            System.out.println(result);

            //在标准输出上打印从客户端读入的字符串
            line=String.valueOf(result);


4.先生成两个人的公钥和私钥,最后通过KeyAgree.java算法得到共同的密钥,将密钥加入客户端和服务器,并运行。


5.客户端通过DigestPass将后缀表达式生成MD5值,服务器接收,并判断与自己的MD5值是否相等,若不相等则终止程序,关键代码如下:

   Dncode dncode = new Dncode();
            String line2 = in.readLine();
            String line3 = in.readLine();
            System.out.println("得到的MD5值为"+line3);
            System.out.println("得到的密文为"+line2);
            String encodeRules = "67,-78,48,-68,-9,63,41,-42,70,-109,24,74,97,-8,71,92,123,46,-80,-123,-100,-29,-120,49,-39,55,-100,-31,62,-46,39,42,-10,-126,-88,-59,-86,-22,67,-95,-81,-122,-107,114,-31,113,-17,110,26,122,-29,57,-27,-70,-67,40,-108,14,-17,8,1,-71,-93,-1,-22,-87,52,12,-29,61,-117,126,73,-69,-62,-48,-38,-128,7,77,95,-88,-22,88,-5,-55,-99,39,107,-128,67,-120,49,-127,-82,-12,-117,13,73,105,-45,118,122,1,-124,123,-18,65,47,-40,105,-30,111,51,13,-83,22,-89,114,-62,-55,98,-15,-8,40,36,37,-88,\n";
            String content = line2;
            System.out.println("根据DH生成的密钥"+encodeRules+"解密后的明文是:"+dncode.AESDncode(encodeRules, content));
            String x=dncode.AESDncode(encodeRules, content);
            MessageDigest m=MessageDigest.getInstance("MD5");
            m.update(x.getBytes("UTF8"));
            byte s[ ]=m.digest( );
            String result1="";
            for (int i=0; i<s.length; i++){
                result1+=Integer.toHexString((0x000000ff & s[i]) |
                        0xffffff00).substring(6);
            }
           if (!result1.equals(line3)) {
               System.out.println("密文被篡改");
               System.exit(0);
           }
            MyDC dc = new MyDC();
            int result = dc.evaluate (new String(dncode.AESDncode(encodeRules, content)));
            System.out.println(result);

实验感想

这周实验虽然做的并不顺利,但是我是真的把每一个环节给弄懂了,学到了知识。

posted @ 2017-06-11 20:14  润润大魔王  阅读(297)  评论(0编辑  收藏  举报