1. 程式人生 > >20172325 2017-2018-2 《程序設計與數據結構》實驗五報告

20172325 2017-2018-2 《程序設計與數據結構》實驗五報告

轉化 secretkey 傳輸 結對編程 data CA tput 課程 表達式表達式

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);
    }

    }
    }```

    感想

    通過做這部分實驗,我意識到了網絡信息加密保護的安全性和重要性,在信息的傳遞中,會出現很多的泄密漏洞,機密信息和容易被竊取篡改,在這個過程中需要的保護措施就很重要,讓我意識到我們需要積極加強網絡安全技術的學習。

參考資料

數據結構的應用
?

20172325 2017-2018-2 《程序設計與數據結構》實驗五報告