在线五子棋JAVA网络编程_实验五 Java网络编程及安全
一、實驗內容
1.掌握Socket程序的編寫;
2.掌握密碼技術的使用;
3.設計安全傳輸系統。
二、實驗步驟
1. 基于Java Socket實現安全傳輸
2. 基于TCP實現客戶端和服務器,結對編程一人負責客戶端,一人負責服務器
3. 使用Git進行版本控制
4. 選擇對稱算法進行數據加解密.
5. 選擇非對稱算法對對稱加密密鑰進行密鑰分發.
6. 選擇合適的Hash算法進行完整性驗證.
7. 選擇合適的算法對Hash值進行簽名/驗證.
三、設計思路
起初,我與隊友看到這個實驗題目是一籌莫展的,一是不太了解IO流的文件讀取與文件存儲位置,二是即使在課上聽懂了客戶端與服務器之間的加解密消息與傳送的流程也不知道如何應用java代碼將其實現。
在實驗課上,我們咨詢了老師的大致操作,并且仔細學習書上有關IO流的知識以及應用哈希函數驗證加解密過程的正確性的實現,開始動手操作了。
1.首先是運行服務器與客戶端的代碼。
客戶端
public static voidmain(String[] args) throws Exception{
InetAddress addr=InetAddress.getByName("192.168.252.1");
System.out.println("addr="+addr);
Socket socket=new Socket(addr,8080);try{
System.out.println("socket="+socket);
BufferedReaderin=new BufferedReader(newInputStreamReader(socket.getInputStream()));
PrintWriterout=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);for(int i=0;i<10;i++){out.println("howdy"+i);
String str=in.readLine();
System.out.println(str);
}
2.在客戶端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
System.out.print(kb[i]+",");//打印擴展秘鑰
}
3.然后打印明文,并轉換為UTF8格式,并將明文用秘鑰加密。
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);byte ptext[]=s.getBytes("UTF8");for(int i=0;i
System.out.print(ptext[i]+",");
}
System.out.println("");byte ctext[]=cp.doFinal(ptext);for(int i=0;i
System.out.print(ctext[i] +",");
}
4.傳遞密文給服務器
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
5.服務器應用隨機秘鑰發生器產生服務器的公鑰和私鑰
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp=kpg.genKeyPair();
PublicKey pbkey=kp.getPublic();
PrivateKey prkey=kp.getPrivate();
FileOutputStream f1= newFileOutputStream("Skey_RSA_pub.dat");
ObjectOutputStream b1= newObjectOutputStream(f1);
b1.writeObject(pbkey);
FileOutputStream f2= newFileOutputStream("Skey_RSA_priv.dat");
ObjectOutputStream b2= newObjectOutputStream(f2);
b2.writeObject(prkey);
6.客戶端創建服務器的公開密鑰,將密鑰加密傳遞給服務器
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=newObjectInputStream(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=newBigInteger(ptext1);
BigInteger c=m.modPow(e,n);
System.out.println("c="+c);
String cs=c.toString( );
BufferedWriter out1=
new BufferedWriter(newOutputStreamWriter(new FileOutputStream("Enc_RSA.dat")));
out1.write(cs,0,cs.length( ));
out1.close( );
7.服務器用服務器的私鑰將客戶端傳輸的DES的秘鑰解密
BufferedReader in1=
new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));
String ctext=in1.readLine();
BigInteger c=newBigInteger(ctext);
FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
ObjectInputStream b=newObjectInputStream(f);
RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
BigInteger d=prk.getPrivateExponent();
BigInteger n=prk.getModulus();
System.out.println("d="+d);
System.out.println("n="+n);
BigInteger m=c.modPow(d,n);
System.out.println("m="+m);byte[] mt=m.toByteArray();
System.out.println("PlainKey is");for(int i=0;i
{
System.out.print((char) mt[i]);
}
8.服務器用上一步產生的秘鑰解密DES產生的密文
FileInputStream fsd=new FileInputStream("SEnc.dat");int num=fsd.available();byte[ ] ctextd=new byte[num];
fsd.read(ctextd);
FileInputStream fsd2=new FileInputStream("keykb1.dat");int num2=fsd2.available();byte[ ] keykb=new byte[num2];
fsd2.read(keykb);
SecretKeySpec k=new SecretKeySpec(keykb,"DESede");
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);byte []ptext=cp.doFinal(ctextd);
String p=new String(ptext,"UTF8");
System.out.println("服務器收到的信息為"+p);
9.服務器、客戶端應用Hash函數驗證加解密的正確性
System.out.println(result);*/String ha= in.readLine();
String sa=hash(p);if(ha.equals(sa))
System.out.println("正確");
}finally{
System.out.println("closing..");
socket.close();
}
}finally{
s.close();
}
String x=s;
MessageDigest md5=MessageDigest.getInstance("MD5");
md5.update(x.getBytes( ));byte smd5[ ]=md5.digest( );
String result="";for (int i=0; i
result+=Integer.toHexString((0x000000ff & smd5[i]) |
0xffffff00).substring(6);
}
System.out.println(result);
四、實驗結果
客戶端
服務器
兩張圖片驗證的哈希值相同,說明加解密成功。
五、遇到的問題
兩個人進行測試時,服務器與客戶端已成功連接,但是服務器不顯示結果,當自己相連時,會出現服務器結果,但是會被客戶端結果覆蓋,但可以快速截圖截下結果,且結果正確。
六、解決辦法
至今為止,調試多次并沒有找到可行的解決辦法,明天檢查代碼時咨詢老師。
七、實驗分析
這次實驗從全班同學都不會做,到一點點探究,一點點學習,最終做出不甚完美,但結果正確的代碼還是很有收獲的。我從中學會了IO流傳輸以及文件的存儲與讀取。而且在這次試驗中,我并不太了解老師打包發給我們的密碼算法的每一條語句,但是把他們篩選整合,拼湊到一個代碼中的技能卻掌握了,學習java語言最重要的是掌握方法與架構,那些具體的函數與語句不是完全明白也可以應用它們。
八、統計時間
步驟
耗時
百分比
需求分析
3h
27.3%
設計
1h
9.1%
代碼實現
2h
18.2%
測試
4h
36.4%
分析總結
1h
9.1%
總結
以上是生活随笔為你收集整理的在线五子棋JAVA网络编程_实验五 Java网络编程及安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keil MDK5 破解
- 下一篇: java美元兑换,(Java实现) 美元