標籤:
Java實驗報告五:Java網路編程及安全
20135315 宋宸寧
一、實驗內容
1.掌握Socket程式的編寫;
2.掌握密碼技術的使用;
3.設計安全傳輸系統。
二、實驗步驟
1. 基於Java Socket實現安全傳輸
2. 基於TCP實現用戶端和伺服器,結對程式設計一人負責用戶端,一人負責伺服器
3. 使用Git進資料列版本設定
4. 選擇對稱演算法進行資料加解密.
5. 選擇非對稱演算法對對稱式加密密鑰進行密鑰分發.
6. 選擇合適的Hash演算法進行完整性驗證.
7. 選擇合適的演算法對Hash值進行簽名/驗證.
三、設計思路
我的結隊夥伴是蘆暢:http://www.cnblogs.com/bonjourvivi/p/4565004.html
1.我負責的是伺服器的部分,在用戶端Client程式中輸入明文“Hello World!”然後利用隨機秘鑰發生器產生DES秘鑰,經過秘鑰擴充,將擴充秘鑰應用IO流存入檔案keykb1.dat中,並列印輸出擴充秘鑰。
String s="Hello World!"; KeyGenerator kg=KeyGenerator.getInstance("DESede"); kg.init(168); SecretKey k=kg.generateKey( ); byte[ ] kb=k.getEncoded( ); FileOutputStream fk=new FileOutputStream("keykb1.dat"); fk.write(kb); for(int i=0;i<kb.length;i++){ System.out.print(kb[i]+",");//列印擴充秘鑰 }
2.將明文加密,並將密文以UTF8編碼方式列印出來
Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); for(int i=0;i<ptext.length;i++){ System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); for(int i=0;i<ctext.length;i++){ System.out.print(ctext[i] +","); }
3.傳遞密文給伺服器
FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext);
4.用戶端利用伺服器的公開密鑰,將祕密金鑰加密傳遞給伺服器
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat"); ObjectInputStream b=new ObjectInputStream(f); RSAPublicKey pbk=(RSAPublicKey)b.readObject( ); BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); System.out.println("e= "+e); System.out.println("n= "+n); byte ptext1[]=s.getBytes("UTF8"); BigInteger m=new BigInteger(ptext1); BigInteger c=m.modPow(e,n); System.out.println("c= "+c); String cs=c.toString( ); BufferedWriter out1= new BufferedWriter(new OutputStreamWriter( new FileOutputStream("Enc_RSA.dat"))); out1.write(cs,0,cs.length( )); out1.close( );
9.用戶端用hash函數給明文加密,將明文的雜湊值通過IO流傳遞給密文
String x=s;
MessageDigest md5=MessageDigest.getInstance("MD5"); md5.update(x.getBytes( )); byte smd5[ ]=md5.digest( ); String result=""; for (int i=0; i<smd5.length; i++){ result+=Integer.toHexString((0x000000ff & smd5[i]) | 0xffffff00).substring(6); } System.out.println(result);
out.println(result);
四、實驗結果
用戶端
五、遇到的問題
兩個人進行測試時,伺服器與用戶端已成功串連,但是伺服器不顯示結果,當自己相連時,會出現伺服器結果,但是會被用戶端結果覆蓋,但可以快速截下結果,且結果正確。
六、解決辦法
在一台電腦上實現資料的加解密傳輸。
七、統計時間
步驟 |
耗時 |
百分比 |
需求分析 |
3h |
27.3% |
設計 |
1h |
9.1% |
代碼實現 |
2h |
18.2% |
測試 |
4h |
36.4% |
分析總結 |
1h |
9.1% |
Java實驗報告五:Java網路編程及安全