2017-2018-2 20165330 實驗五《網絡編程與安全》實驗報告

實驗目的

  1. 瞭解計算機網絡基礎
  2. 掌握Java Socket編程
  3. 理解混合密碼系統
  4. 掌握Java 密碼技術相關API的使用

實驗內容

任務一

  1. 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  2. 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
  3. 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java
  4. 上傳測試代碼運行結果截圖和碼雲連接
  • 知識點
    • 表達式Exp = S1 + OP + S2(S1,S2是兩個操做數,OP爲運算符)有三種標識方法:
      • OP + S1 + S2 爲前綴表示法
      • S1 + OP + S2 爲中綴表示法
      • S1 + S2 + OP 爲後綴表示法
    • dc運算符:
      • +: 依次彈出w1與w2,將w2+w1壓棧。精度爲結果值精度
      • -: 依次彈出w1與w2,將w2-w1壓棧
      • : 依次彈出w1與w2,將w2w1壓棧。精度爲結果值精度與precision中較大值
      • / : 依次彈出w1與w2,將w2/w1壓棧。精度爲precision
      • % : 依次彈出w1與w2,將w2-w2/w1*w1壓棧
    • 實現後綴表達式僞代碼:
      • 設置一個操做數棧,開始棧爲空;
      • 從左到右掃描後綴表達式,遇操做數,進棧;
      • 若遇運算符,則從棧中退出兩個元素,先退出的放到運算符的右邊,後退出的放到運算符左邊,運算後的結果再進棧,直到後綴表達式掃描完畢。
    • 中綴式求得後綴式僞代碼:
      • 設立一個棧,存放運算符,首先棧爲空;
      • 從左到右掃描中綴式,若遇到操做數,直接輸出,並輸出一個空格做爲兩個操做數的分隔符;
      • 若遇到運算符,則與棧頂比較,比棧頂級別高則進棧,不然退出棧頂元素並輸出,而後輸出一個空格做分隔符;
      • 若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止。
        當棧變成空時,輸出的結果即爲後綴表達式。
  • 碼雲連接
  • 運行結果
    image

任務二

結對編程:1人負責客戶端,一人負責服務器html

  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
  4. 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果
  6. 上傳測試結果截圖和碼雲連接
  • 知識點
    • 套接字是基於TCP協議的網絡通訊
      • 客戶端套接字
        • 對象創建方法:使用Socket類
        • Socket構造方法:Socket(String host,int port)
      • ServerSocket對象與服務器端套接字
        • 構造方法:ServerSocket(int port)
        • 使用方法accept()將客戶端的套接字和服務器端的套接字鏈接起來
    • 通訊完畢後,套接字使用close()方法關閉套接字鏈接
      • 多線程技術
        • 服務器端收到一個客戶端的套接字時,就會啓動一個專門爲該客戶服務的線程
    • 套接字通訊基本原則
      • 服務器應當啓動一個專門的線程,在該線程中和客戶的套接字創建鏈接
      • 因爲套接字的輸入流在讀取信息時可能發生阻塞,客戶端和服務器端都須要在一個單獨的線程中讀取信息
  • 客戶端代碼
  • 運行結果
    image
    image

任務三

加密結對編程:1人負責客戶端,一人負責服務器java

  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
  4. 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果
  6. 上傳測試結果截圖和碼雲連接
  • 知識點
    • 「DES」是目前最經常使用的對稱加密算法
    • 初始化密鑰生成器 kg.init(168)(密鑰長度必須是56位)
    • 生成密鑰SecretKey k=kg.generateKey( )
    • 經過對象序列化方式將密鑰保存在文件中
      • FileOutputStream f=new FileOutputStream("key1.dat")
      • ObjectOutputStream b=new ObjectOutputStream(f)
      • b.writeObject(k)
  • 客戶端代碼
  • 運行結果
    image
    image

任務四

密鑰分發結對編程:1人負責客戶端,一人負責服務器git

  1. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  2. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
  3. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  4. 服務器接收到後綴表達式表達式後,進行解密,而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果
  6. 上傳測試結果截圖和碼雲連接
  • 知識點
    • DH算法是創建在DH公鑰和私鑰的基礎上的, A須要和B共享密鑰時,A和B各自生成DH公鑰和私鑰,公鑰對外公佈而私鑰各自祕密保存。本實例將介紹Java中如何建立並部署DH公鑰和私鑰,以便後面一小節利用它建立共享密鑰。
    • 使用KeyPairGenerator類建立DH公鑰和私鑰
    • 建立密鑰協定對象:KeyAgreement ka=KeyAgreement.getInstance("DH");
    • 初始化密鑰協定對象:ka.init(prk);
    • 執行密鑰協定:ka.doPhase(pbk,true);
    • 生成共享信息:byte[ ] sb=ka.generateSecret();
  • 客戶端代碼
  • 運行結果
    image
    image

任務五

完整性校驗結對編程:1人負責客戶端,一人負責服務器算法

  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
  4. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  5. 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
  6. 客戶端顯示服務器發送過來的結果
  7. 上傳測試結果截圖和碼雲連接
  • 知識點
    • Java摘要算法- MD5
    • java.security包中的MessageDigest類提供了計算消息摘要的方法
    • 生成MessageDigest對象:
      MessageDigest m=MessageDigest.getInstance("MD5");
    • 傳入須要計算的字符串:
      m.update(x.getBytes("UTF8" )); (x爲須要計算的字符串,update傳入的參數是字節類型或字節類型數組,對於字符串,須要先使用getBytes( )方法生成字符串數組。)
    • 計算消息摘要:
      byte s[ ]=m.digest( ); (執行MessageDigest對象的digest( )方法完成計算,計算的結果經過字節類型的數組返回。)
    • 處理計算結果
String result="";
for (int i=0; i<s.length; i++){
       result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
  }

實驗過程當中遇到的問題及解決辦法

  1. 在運行虛擬機時出現以下狀況

image
image

解決方法:緣由是在IDEAgit時存在與碼雲相同的文件,虛擬機裏存在共同分享文件,我改變了這個文件本來的位置而出錯,我移出後運行成功。編程

實驗總結

  • 此次實驗更增強了我與小夥伴之間的默契,我更加詳細的瞭解了客戶端與服務器的運用操做,對代碼有了更進一步的瞭解,並且對Java與密碼學之間的聯繫也有了深入的認識。

參考資料數組

相關文章
相關標籤/搜索