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

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

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

1.實驗內容

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

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

    • 實驗結果:
      算法

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

      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算法原理

相關文章
相關標籤/搜索