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

# 學號 2017-2018-20172309 《程序設計與數據結構》實驗五報告

密文 公鑰 direction io流總結 代碼 解決 reader PE init

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

課程:《程序設計與數據結構》
班級: 1723
姓名: 王誌偉
學號:20172309
實驗教師:王誌強老師
實驗日期:2018年6月13日
必修/選修: 必修

1.實驗內容

  • 預備實驗:
    • 實驗要求:

      1.夥伴1編寫服務器端程序,接收客戶端發送的數據(形式如下:12 15 8 100 25 34 19),將其排序後,發回給客戶端。
      2.夥伴2編寫客戶端程序,將一串字符串(形式如下:12 15 8 100 25 34 19)發送給服務器端,接收排序後的程序,並顯示。
      3.截圖上傳,附上碼雲地址。

    • 實驗結果:技術分享圖片
      技術分享圖片

    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/blob/master/Test/test4/SocketServer.java
  • 實驗一:
    • 實驗要求:

      1. 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
      2. 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
      3. 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java
      4. 上傳測試代碼運行結果截圖和碼雲鏈接
    • 實驗結果:技術分享圖片
    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/0e4bda31576202a6268adec734736cd4d63fa915

  • 實驗二:
    • 實驗要求:

      1. 註意責任歸宿,要會通過測試證明自己沒有問題
      2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
      3. 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式通過網絡發送給服務器
      4. 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
      5. 客戶端顯示服務器發送過來的結果
      6. 上傳測試結果截圖和碼雲鏈接
    • 實驗結果:技術分享圖片
      技術分享圖片

    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/05b5f89e5e3ac0849301491c205788ed5127cb5d

  • 實驗三:
    • 實驗要求:

      1. 註意責任歸宿,要會通過測試證明自己沒有問題
      2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
      3. 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密後通過網絡把密文發送給服務器
      4. 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,可以用數組保存),然後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
      5. 客戶端顯示服務器發送過來的結果
      6. 上傳測試結果截圖和碼雲鏈接
    • 實驗結果:技術分享圖片
      技術分享圖片
    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/63d4894a9a022b36c18cd2e8a9a12127c30649b5

  • 實驗四:
    • 實驗要求:

      1. 註意責任歸宿,要會通過測試證明自己沒有問題
      2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
      3. 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密通過網絡把密文發送給服務器
      4. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
      5. 服務器接收到後綴表達式表達式後,進行解密,然後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
      6. 客戶端顯示服務器發送過來的結果
      7. 上傳測試結果截圖和碼雲鏈接
    • 實驗結果:技術分享圖片
      技術分享圖片
    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/tree/master/Test/test4/wednesdaytest/test4/direction3

  • 實驗五:
    • 實驗要求:

      1. 註意責任歸宿,要會通過測試證明自己沒有問題
      2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
      3. 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密通過網絡把密文和明文的MD5値發送給服務器
      4. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
      5. 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
      6. 客戶端顯示服務器發送過來的結果
      7. 上傳測試結果截圖和碼雲鏈接
    • 實驗結果:技術分享圖片
      技術分享圖片

    • 程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/tree/master/Test/test4/wednesdaytest/test5

      2. 問題及解決方案:

  • 問題一:運行了以後一直沒反應,(保證自己寫的代碼沒問題!)技術分享圖片

  • 解決方案:這個實驗是根據老師發過來的代碼進行改造的,因此在這

    > //出現問題 
    >     String info=null;
    >            String temp=null;
    >            while(!((temp = bufferedReader.readLine()) ==null)){//當使用while語句時,因為temp一直是空的,所以循環一直進行!(在前面應該對temp進行賦值,令temp = info)
    >                info = temp;
    >                System.out.println("我是服務器,學號【20172310】用戶信息為:" + info);
    >            }
  • 問題二:在進行測試2時,當中綴表達式中含有“×”時,出現亂碼!輸出結果不能顯示“×”。
  • 解決方案:出現這個問題的方法可能是使用的字符標準不同:技術分享圖片
    客服端與服務器都得使用“UTF-8”標準。

  • 問題三:進行測試四的時候,需要使用DH算法進行秘鑰傳輸。而生成秘鑰的程序需要使用命令行進行實驗。

    >public static void main(String args[ ]) throws Exception{//此處只能使用命令行輸入命令
    >    DHParameterSpec DHP=
    >new DHParameterSpec(skip1024Modulus,skip1024Base);
    >
    >         KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH");
    >         kpg.initialize(DHP);
    >         KeyPair kp=kpg.genKeyPair();
    >    
    >         PublicKey pbk=kp.getPublic();
    >         PrivateKey prk=kp.getPrivate();
    >         // 保存公鑰
    >         FileOutputStream  f1=new FileOutputStream(args[0]);
    >         ObjectOutputStream b1=new  ObjectOutputStream(f1);
    >         b1.writeObject(pbk);
    >         // 保存私鑰
    >         FileOutputStream  f2=new FileOutputStream(args[1]);
    >         ObjectOutputStream b2=new  ObjectOutputStream(f2);
    >         b2.writeObject(prk);
    >       }

    而我想要的是在想使用這個程序,調用一個方法就行,因此,我們可以這樣改:

    >     public static void fun(String s1,String s2) throws Exception{//將 args[] 改成一個方法+參數 
    >            DHParameterSpec DHP= new DHParameterSpec(skip1024Modulus,skip1024Base);
    >            KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH");
    >            kpg.initialize(DHP);
    >            KeyPair kp=kpg.genKeyPair();
    >            PublicKey pbk=kp.getPublic();
    >            PrivateKey prk=kp.getPrivate();
    >            //保存公鑰
    >            FileOutputStream f1=new FileOutputStream(s1);
    >            ObjectOutputStream b1=new  ObjectOutputStream(f1);
    >            b1.writeObject(pbk);
    >            //保存私鑰
    >            FileOutputStream  f2=new FileOutputStream(s2);
    >            ObjectOutputStream b2=new  ObjectOutputStream(f2);
    >            b2.writeObject(prk);
    >          }

    這樣我們想要實現這個功能,只需要調用這個方法就行了。

    3. 收獲感悟


    實驗五是在實驗三的基礎上做的,用到了實驗三詳細說明的密碼學內容。在學實驗三的時候,根本看不懂!!!可能是自己沒認真看全部是復制粘貼的。不過現在重新學了一下感覺好多了,好像能看出個所以然出來了。實驗五的目的是讓我們學會用加密形式進行傳輸,雖然在實驗的過程中出現了很多錯誤,但最後都解決了,而且在做實驗的過程中發現弄這個實驗其實也挺有趣的。最後提交作業的時候發現自己是交的比較早的,因為我是站在巨人的肩膀上完成實驗的(參考了網上的一些方法)!在此感謝他們~

4. 參考文獻

1.java密碼學算法
2.java IO流總結
3.IO流詳解
4.DH算法原理

# 學號 2017-2018-20172309 《程序設計與數據結構》實驗五報告