# 學號 2017-2018-20172309 《程序設計與數據結構》實驗五報告
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
- 實驗一:
實驗要求:
- 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
- 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java
- 上傳測試代碼運行結果截圖和碼雲鏈接
- 實驗結果:
程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/0e4bda31576202a6268adec734736cd4d63fa915
- 實驗二:
實驗要求:
- 註意責任歸宿,要會通過測試證明自己沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式通過網絡發送給服務器
- 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲鏈接
實驗結果:
程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/05b5f89e5e3ac0849301491c205788ed5127cb5d
- 實驗三:
實驗要求:
- 註意責任歸宿,要會通過測試證明自己沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密後通過網絡把密文發送給服務器
- 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,可以用數組保存),然後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲鏈接
- 實驗結果:
程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/63d4894a9a022b36c18cd2e8a9a12127c30649b5
- 實驗四:
實驗要求:
- 註意責任歸宿,要會通過測試證明自己沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密通過網絡把密文發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,然後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲鏈接
- 實驗結果:
程序代碼:https://gitee.com/CS-IMIS-23/20172309_javaProgramming/tree/master/Test/test4/wednesdaytest/test4/direction3
- 實驗五:
實驗要求:
- 註意責任歸宿,要會通過測試證明自己沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,然後把中綴表達式調用MyBC.java的功能轉化為後綴表達式,把後綴表達式用3DES或AES算法加密通過網絡把密文和明文的MD5値發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲鏈接
實驗結果:
程序代碼: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 《程序設計與數據結構》實驗五報告