1、實驗報告封面
- 課程:Java程序設計 班級:1752班 姓名:吳一凡 學號:20175217
- 指導教師:婁嘉鵬 實驗日期:2019年5月25日
- 實驗時間:--- 實驗序號:實驗五
- 實驗名稱:網絡編程與安全
2、實驗內容與步驟
1.任務一:兩人一組結對編程。
(1)任務要求:
- 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 結對實現中綴表達式轉後綴表達式的功能
MyBC.java
- 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用
MyDC.java
- 上傳測試代碼運行結果截圖和碼雲連接
(2)實驗原理
將運算符寫在兩個操做數中間的表達式,稱爲「中綴表達式」,如1+2*(3-4)+5
。在中綴表達式中,運算符具備不一樣的優先級,圓括號用於改變運算符的運算次序,因此求值過程不能直接按照從左到右的順序進行。html
將運算符寫在兩個操做數以後的表達式稱爲「後綴表達式」,如上面的中綴表達式可轉換爲後綴表達式1 2 3 4 - * + 5 +
。後綴表達式中沒有括號,並且運算符沒有優先級。後綴表達式的求值過程可以嚴格地從左到右按順序進行,符合運算器的求值規律。java
表達式求值算法分兩步進行:①中綴轉後綴;②求後綴表達式的值。git
由中綴式求得後綴式可使用棧,僞代碼以下:算法
- 設立一個棧,存放運算符,首先棧爲空;
- 從左到右掃描中綴式,若遇到操做數,直接輸出,並輸出一個空格做爲兩個操做數的分隔符;
- 若遇到運算符,則與棧頂比較,比棧頂級別高則進棧,不然退出棧頂元素並輸出,而後輸出一個空格做分隔符;
- 若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止。
- 當棧變成空時,輸出的結果即爲後綴表達式。
- 後綴表達式求值僞代碼以下:
- 設置一個操做數棧,開始棧爲空;
- 從左到右掃描後綴表達式,遇操做數,進棧;
- 若遇運算符,則從棧中退出兩個元素,先退出的放到運算符的右邊,後退出的放到運算符左邊,運算後的結果再進棧,直到後綴表達式掃描完畢。
- 重複以上步驟,直至後綴表達式結束,棧中最後一個數字就是所求表達式的值。
詳細過程見四則運算編程編程
(3)任務截圖
2.任務二:結對編程。
(1)任務要求:1人負責客戶端,1人負責服務器。
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用
MyBC.java
的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
- 服務器接收到後綴表達式,調用
MyDC.java
的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
(2)實驗原理
- 使用java.net.Socket對象來表示一個套接字
- 使用Socket的構造方法建立套接字,如:public Socket(java.lang.String host, int port)。其中,host是遠程機器名或IP地址,port是端口號,IP地址查詢方法以下:
(3)任務截圖
客戶端截圖
服務器
服務器截圖
網絡
3.任務三:加密結對編程。
(1)任務要求:1人負責客戶端,1人負責服務器
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
- 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
(2)實驗原理
- 客戶端使用
AES_Key
生成AES密鑰並輸出到文件
(3)任務截圖
客戶端截圖
服務器截圖
4.任務四:密鑰分發結對編程。
(1)任務要求:1人負責客戶端,1人負責服務器
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
(2)實驗原理
- 兩人先使用
Key_DH
類生成各自的DH公鑰和私鑰
- 倆人使用對方的公鑰和本身的私鑰,用
KeyAgree
,生成共享密鑰
- 客戶端使用共享密鑰對原有的密鑰進行加密,並把密文和加密後的密鑰傳輸給服務器
- 服務器先用共享密鑰對客戶端加密的密鑰進行解密,再用解密後的密鑰解密密文
(3)任務截圖
客戶端截圖
服務器截圖
5.任務五:完整性校驗結對編程。
(1)任務要求:1人負責客戶端,1人負責服務器
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
(2)實驗原理
- 使用
DigestPass.MD5(String s)
生成MD5值
(3)任務截圖
客戶端截圖
服務器截圖
3、實驗中碰到的問題
1.使用jdk包版本不對的問題
問題:導入如下兩個包出現錯誤
解決:使用jdk包版本不對,項目使用的是jdk11,而這兩個包是jdk8中的,所以出現上圖錯誤,新建了一個jdk8的項目,解決了
2.結對夥伴傳輸的被加密的密鑰與解密後原密鑰不對的問題
問題:傳輸密鑰多此一舉的使用如下代碼以後傳輸,而不是直接使用key1
(String)
String keyone= new String (a1);
keyone = Encoder.AESEncode(sharekey,keyone);//客戶端對密鑰進行DH加密
致使下圖的問題
解決:使用原來的密鑰加密後直接傳輸(主要問題在於新建的密鑰字符串相比於原來的密鑰少了一個空格)
3.發現結對夥伴生成的是DES密鑰而不是AES密鑰
問題:
解決:修改密鑰生成器,使其生成AES密鑰
4.生成AES密鑰時,出現以下錯誤
問題:
解決:AES密鑰長度只能是12八、19二、256位的,修改位數便可
4、碼雲連接