日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

在线五子棋JAVA网络编程_实验五 Java网络编程及安全

發(fā)布時(shí)間:2023/12/10 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在线五子棋JAVA网络编程_实验五 Java网络编程及安全 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。