實驗目的
- 瞭解計算機網絡基礎
- 掌握Java Socket編程
- 理解混合密碼系統
- 掌握Java 密碼技術相關API的使用
實驗內容
任務一
- 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 結對實現中綴表達式轉後綴表達式的功能 MyBC.java
- 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用MyDC.java
- 上傳測試代碼運行結果截圖和碼雲連接
- 知識點
- 表達式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](http://static.javashuo.com/static/loading.gif)
任務二
結對編程:1人負責客戶端,一人負責服務器html
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
- 服務器接收到後綴表達式,調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
- 知識點
- 套接字是基於TCP協議的網絡通訊
- 客戶端套接字
- 對象創建方法:使用Socket類
- Socket構造方法:Socket(String host,int port)
- ServerSocket對象與服務器端套接字
- 構造方法:ServerSocket(int port)
- 使用方法accept()將客戶端的套接字和服務器端的套接字鏈接起來
- 通訊完畢後,套接字使用close()方法關閉套接字鏈接
- 多線程技術
- 服務器端收到一個客戶端的套接字時,就會啓動一個專門爲該客戶服務的線程
- 套接字通訊基本原則
- 服務器應當啓動一個專門的線程,在該線程中和客戶的套接字創建鏈接
- 因爲套接字的輸入流在讀取信息時可能發生阻塞,客戶端和服務器端都須要在一個單獨的線程中讀取信息
- 客戶端代碼
- 運行結果
![image](http://static.javashuo.com/static/loading.gif)
![image](http://static.javashuo.com/static/loading.gif)
任務三
加密結對編程:1人負責客戶端,一人負責服務器java
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
- 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
- 知識點
- 「DES」是目前最經常使用的對稱加密算法
- 初始化密鑰生成器
kg.init(168)
(密鑰長度必須是56位)
- 生成密鑰
SecretKey k=kg.generateKey( )
- 經過對象序列化方式將密鑰保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat")
、
ObjectOutputStream b=new ObjectOutputStream(f)
、
b.writeObject(k)
- 客戶端代碼
- 運行結果
![image](http://static.javashuo.com/static/loading.gif)
![image](http://static.javashuo.com/static/loading.gif)
任務四
密鑰分發結對編程:1人負責客戶端,一人負責服務器git
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,而後調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
- 知識點
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](http://static.javashuo.com/static/loading.gif)
![image](http://static.javashuo.com/static/loading.gif)
任務五
完整性校驗結對編程:1人負責客戶端,一人負責服務器算法
- 注意責任歸宿,要會經過測試證實本身沒有問題
- 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
- 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用MyBC.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
- 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
- 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用MyDC.java的功能計算後綴表達式的值,把結果發送給客戶端
- 客戶端顯示服務器發送過來的結果
- 上傳測試結果截圖和碼雲連接
- 知識點
- 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);
}
實驗過程當中遇到的問題及解決辦法
- 在運行虛擬機時出現以下狀況
![image](http://static.javashuo.com/static/loading.gif)
![image](http://static.javashuo.com/static/loading.gif)
解決方法:緣由是在IDEAgit
時存在與碼雲相同的文件,虛擬機裏存在共同分享文件,我改變了這個文件本來的位置而出錯,我移出後運行成功。編程
實驗總結
- 此次實驗更增強了我與小夥伴之間的默契,我更加詳細的瞭解了客戶端與服務器的運用操做,對代碼有了更進一步的瞭解,並且對Java與密碼學之間的聯繫也有了深入的認識。
參考資料數組