在线五子棋JAVA网络编程_实验五 Java网络编程及安全
一、實(shí)驗(yàn)內(nèi)容
1.掌握Socket程序的編寫(xiě);
2.掌握密碼技術(shù)的使用;
3.設(shè)計(jì)安全傳輸系統(tǒng)。
二、實(shí)驗(yàn)步驟
1. 基于Java Socket實(shí)現(xiàn)安全傳輸
2. 基于TCP實(shí)現(xiàn)客戶端和服務(wù)器,結(jié)對(duì)編程一人負(fù)責(zé)客戶端,一人負(fù)責(zé)服務(wù)器
3. 使用Git進(jìn)行版本控制
4. 選擇對(duì)稱算法進(jìn)行數(shù)據(jù)加解密.
5. 選擇非對(duì)稱算法對(duì)對(duì)稱加密密鑰進(jìn)行密鑰分發(fā).
6. 選擇合適的Hash算法進(jìn)行完整性驗(yàn)證.
7. 選擇合適的算法對(duì)Hash值進(jìn)行簽名/驗(yàn)證.
三、設(shè)計(jì)思路
起初,我與隊(duì)友看到這個(gè)實(shí)驗(yàn)題目是一籌莫展的,一是不太了解IO流的文件讀取與文件存儲(chǔ)位置,二是即使在課上聽(tīng)懂了客戶端與服務(wù)器之間的加解密消息與傳送的流程也不知道如何應(yīng)用java代碼將其實(shí)現(xiàn)。
在實(shí)驗(yàn)課上,我們咨詢了老師的大致操作,并且仔細(xì)學(xué)習(xí)書(shū)上有關(guān)IO流的知識(shí)以及應(yīng)用哈希函數(shù)驗(yàn)證加解密過(guò)程的正確性的實(shí)現(xiàn),開(kāi)始動(dòng)手操作了。
1.首先是運(yùn)行服務(wù)器與客戶端的代碼。
客戶端
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!”然后利用隨機(jī)秘鑰發(fā)生器產(chǎn)生DES秘鑰,并將秘鑰應(yīng)用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]+",");//打印擴(kuò)展秘鑰
}
3.然后打印明文,并轉(zhuǎn)換為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.傳遞密文給服務(wù)器
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
5.服務(wù)器應(yīng)用隨機(jī)秘鑰發(fā)生器產(chǎn)生服務(wù)器的公鑰和私鑰
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.客戶端創(chuàng)建服務(wù)器的公開(kāi)密鑰,將密鑰加密傳遞給服務(wù)器
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.服務(wù)器用服務(wù)器的私鑰將客戶端傳輸?shù)腄ES的秘鑰解密
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.服務(wù)器用上一步產(chǎn)生的秘鑰解密DES產(chǎn)生的密文
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("服務(wù)器收到的信息為"+p);
9.服務(wù)器、客戶端應(yīng)用Hash函數(shù)驗(yàn)證加解密的正確性
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);
四、實(shí)驗(yàn)結(jié)果
客戶端
服務(wù)器
兩張圖片驗(yàn)證的哈希值相同,說(shuō)明加解密成功。
五、遇到的問(wèn)題
兩個(gè)人進(jìn)行測(cè)試時(shí),服務(wù)器與客戶端已成功連接,但是服務(wù)器不顯示結(jié)果,當(dāng)自己相連時(shí),會(huì)出現(xiàn)服務(wù)器結(jié)果,但是會(huì)被客戶端結(jié)果覆蓋,但可以快速截圖截下結(jié)果,且結(jié)果正確。
六、解決辦法
至今為止,調(diào)試多次并沒(méi)有找到可行的解決辦法,明天檢查代碼時(shí)咨詢老師。
七、實(shí)驗(yàn)分析
這次實(shí)驗(yàn)從全班同學(xué)都不會(huì)做,到一點(diǎn)點(diǎn)探究,一點(diǎn)點(diǎn)學(xué)習(xí),最終做出不甚完美,但結(jié)果正確的代碼還是很有收獲的。我從中學(xué)會(huì)了IO流傳輸以及文件的存儲(chǔ)與讀取。而且在這次試驗(yàn)中,我并不太了解老師打包發(fā)給我們的密碼算法的每一條語(yǔ)句,但是把他們篩選整合,拼湊到一個(gè)代碼中的技能卻掌握了,學(xué)習(xí)java語(yǔ)言最重要的是掌握方法與架構(gòu),那些具體的函數(shù)與語(yǔ)句不是完全明白也可以應(yīng)用它們。
八、統(tǒng)計(jì)時(shí)間
步驟
耗時(shí)
百分比
需求分析
3h
27.3%
設(shè)計(jì)
1h
9.1%
代碼實(shí)現(xiàn)
2h
18.2%
測(cè)試
4h
36.4%
分析總結(jié)
1h
9.1%
總結(jié)
以上是生活随笔為你收集整理的在线五子棋JAVA网络编程_实验五 Java网络编程及安全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Keil MDK5 破解
- 下一篇: JavaWeb 敏感词汇过滤器