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

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

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

一、实验内容

任务1:

两人一组结对编程:

  • 1.参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  • 2.结对实现中缀表达式转后缀表达式的功能 MyBC.java
  • 3.结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  • 4.上传测试代码运行结果截图和码云链接

任务2:

结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  • 4.服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 5.客户端显示服务器发送过来的结果
  • 6.上传测试结果截图和码云链接

任务3:

加密结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  • 4.服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 5.客户端显示服务器发送过来的结果
  • 6.上传测试结果截图和码云链接

任务4:

密钥分发结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  • 4.客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 5.服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 6.客户端显示服务器发送过来的结果
  • 7.上传测试结果截图和码云链接

任务5:

实验五 网络编程与安全-5
完整性校验结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  • 4.客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 5.服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 6.客户端显示服务器发送过来的结果
  • 7.上传测试结果截图和码云链接

二、 实验过程及结果

任务1:

两人一组结对编程:

  • 1.参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  • 2.结对实现中缀表达式转后缀表达式的功能 MyBC.java
  • 3.结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  • 4.上传测试代码运行结果截图和码云链接

  • 实验感悟:第一部分比较简单,只要能够在自己的IDEA上完成客户端或者服务端的工作即可,也就是说完成中缀转后缀或者后缀表达式的计算就OK,比较简单。

任务2:

结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  • 4.服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 5.客户端显示服务器发送过来的结果
  • 6.上传测试结果截图和码云链接
  • 实验感悟:第二部分开始要求结对完成,第二个任务需要结对完成的是最基础的客户端和服务端的连接和互动。

任务3:

加密结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  • 4.服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 5.客户端显示服务器发送过来的结果
  • 6.上传测试结果截图和码云链接

  • 实验感悟:这一部分要求加上了秘钥的使用,要求结对双方完成加密解密的过程,在这个过程中,我和结对伙伴总是达不到解密的过程,后来发现问题出在我们分别用了加密解密算法,然而没有把两个连接到一起,也就是说,都是随机生成了秘钥,然而他是他的,我是我的,后来修改了加密解密算法的代码实践,完成的该任务。

任务4和任务5:

密钥分发结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  • 4.客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 5.服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 6.客户端显示服务器发送过来的结果
  • 7.上传测试结果截图和码云链接

完整性校验结对编程:1人负责客户端,一人负责服务器

  • 1.注意责任归宿,要会通过测试证明自己没有问题
  • 2.基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 3.客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  • 4.客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 5.服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 6.客户端显示服务器发送过来的结果
  • 7.上传测试结果截图和码云链接
  • 实验感想:在第三个任务的基础上加上了用DH算法进行3DES或AES算法的密钥交换,在最后一个任务中要求用MD5算法,分析信息是否被修改过,当时我忘了截任务4的图,但是因为我们将这两个部分做到了一起,所以就把图接了一个。

            import javax.crypto.Cipher;
            import javax.crypto.spec.SecretKeySpec;
            import java.io.*;
            import java.net.ServerSocket;
            import java.net.Socket;
            import java.security.Key;

            public class Server_4 {
            public static void main(String args[]) {
            ServerSocket serverForClient = null;
            Socket socketOnServer = null;
            DataOutputStream out = null;
            DataInputStream in = null;
            try {
               serverForClient = new ServerSocket(3001);
            } catch (IOException e1) {
                 System.out.println(e1);
            }
            try {
            System.out.println("等待客户呼叫");
            socketOnServer = serverForClient.accept(); //堵塞状态,除非有客户呼叫
            System.out.println("客户已连接");
            out = new DataOutputStream(socketOnServer.getOutputStream());
            in = new DataInputStream(socketOnServer.getInputStream());

            Key_DH.fun("Spub.txt","Spri.txt");
            int len = Integer.parseInt(in.readUTF());
            byte np[] = new byte[len];
            for (int i = 0;i<len;i++) {
                String temp = in.readUTF();
                np[i] = Byte.parseByte(temp);
            }
            ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream(np));
            Key k2 = (Key)ois.readObject();;
            FileOutputStream f2 = new FileOutputStream("Cpub.txt");
            ObjectOutputStream b2 = new ObjectOutputStream(f2);
            b2.writeObject(k2);

            FileInputStream fp = new FileInputStream("Spub.txt");
            ObjectInputStream bp = new ObjectInputStream(fp);
            Key kp = (Key) bp.readObject();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(kp);
            byte[] kb = baos.toByteArray();
            out.writeUTF(kb.length + "");
            for (int i = 0; i < kb.length; i++) {
                out.writeUTF(kb[i] + "");
            }

            KeyAgree.fun("Cpub.txt","Spri.txt");

            String leng = in.readUTF(); // in读取信息,堵塞状态
            byte ctext[] = new byte[Integer.parseInt(leng)];
            for (int i = 0;i<Integer.parseInt(leng);i++) {
                String temp = in.readUTF();
                ctext[i] = Byte.parseByte(temp);
            }
            String check = in.readUTF();
            // 获取密钥
            FileInputStream f = new FileInputStream("sb.txt");
            byte[] keysb = new byte[24];
            f.read(keysb);
            System.out.println("公共密钥:");
            for (int i = 0;i<24;i++) {
                System.out.print(keysb[i]+",");
            }
            System.out.println("");
            SecretKeySpec k = new SecretKeySpec(keysb, "DESede");
            // 解密
            Cipher cp = Cipher.getInstance("DESede");
            cp.init(Cipher.DECRYPT_MODE, k);
            byte[] ptext = cp.doFinal(ctext);
            System.out.println("后缀表达式已被解密:");
            for (int i = 0; i < ptext.length; i++) {
                System.out.print(ptext[i] + ",");
            }
            System.out.println("");
            // 显示明文
            String p = new String(ptext, "UTF8");
            String pMd5 = DigestPass.fun(p);
            System.out.println("解密后明文的MD5值:"+pMd5);
            if (pMd5.equals(check)){
                System.out.println("和客户端的MD5值一致");
                System.out.println("服务器收到客户的请求:计算后缀表达式" + p);
                out.writeUTF(MyDC.jisuan(new StringBuffer(p))+"");
            }
            else {
                System.out.println("警告:和客户端的MD5值不一致!");
            }
        } catch (Exception e) {
            System.out.println("客户已断开" + e);
        }
    }
}```
## 感想
通过做这部分实验,我意识到了网络信息加密保护的安全性和重要性,在信息的传递中,会出现很多的泄密漏洞,机密信息和容易被窃取篡改,在这个过程中需要的保护措施就很重要,让我意识到我们需要积极加强网络安全技术的学习。

## 参考资料
[数据结构的应用](http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA)

posted @ 2018-06-19 21:17  20172325  阅读(151)  评论(0编辑  收藏  举报