Java网络编程及安全
一、實(shí)驗(yàn)內(nèi)容:
1.運(yùn)行教材上TCP代碼,結(jié)對進(jìn)行,一人服務(wù)器,一人客戶端;
2.利用加解密代碼包,編譯運(yùn)行代碼,一人加密,一人解密;
3.集成代碼,一人加密后通過TCP發(fā)送;
注:加密使用AES或者DES/AES或者DES加密密鑰key并發(fā)送,使用服務(wù)器的公鑰加密/公鑰算法使用RSA或DH/檢驗(yàn)發(fā)送信息的完整性使用MD5或者SHA3;
4.用Git進(jìn)行版本控制。
5.完成Blog
我的結(jié)對伙伴是20135126謝飛帆
我負(fù)責(zé)的是客戶端,謝飛帆負(fù)責(zé)的是服務(wù)器
二、實(shí)驗(yàn)步驟
1.信息安全傳送:?????????????
| ??? 發(fā)送方A——————>接收方B A加密時(shí),用B的公鑰 B解密時(shí),用B的私鑰 |
發(fā)送方A對信息(明文)采用DES密鑰加密,使用RSA加密前面的DES密鑰信息,最終將混合信息進(jìn)行傳遞。同時(shí)用hash函數(shù)將明文進(jìn)行用作驗(yàn)證。
?? 接收方B接收到信息后,用RSA解密DES密鑰信息,再用RSA解密獲取到的密鑰信息解密密文信息,最終就可以得到我們要的信息(明文)。用hash函數(shù)對解出的明文進(jìn)行驗(yàn)證,與發(fā)送過來的has
import java.net.*;
?
import java.io.*;
?
import javax.crypto.*;
?
import java.security.*;
?
import javax.crypto.Cipher;
?
?
?
public class MyClient {
?
??? /**
?
???? * @param args the command line arguments
?
???? */
?
??? public static void main(String args[]) throws Exception {
?
???????
?
??????? //隨機(jī)密鑰產(chǎn)生
?
???????? KeyGenerator kg=KeyGenerator.getInstance("DESede");
?
???????? kg.init(168);
?
??????? SecretKey k=kg.generateKey( );
?
??????? FileOutputStream? f=new FileOutputStream("key1.dat");
?
???????? ??? ObjectOutputStream b=new? ObjectOutputStream(f);
?
???????? ??? b.writeObject(k);???????
?
???????
?
??????????? //加密輸入
?
??????????? BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
?
???????? ??? System.out.print("請輸入待發(fā)送的數(shù)據(jù):");
?
???????? ??? String srt=stdin.readLine();
?
??????????????????
?
???????? ??? FileInputStream d=new FileInputStream("key1.dat");
?
???????? ??? ObjectInputStream a=new ObjectInputStream(d);
?
???????? ??? Key e=(Key)a.readObject( );
?
??????????????????
?
?????????????????? Cipher cp=Cipher.getInstance("DESede");
?
??????? cp.init(Cipher.ENCRYPT_MODE, e);
?
??????????????????
?
??????? byte ptext[]=srt.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] +",");
?
??????? }
?
??????????????????
?
?????????????????? FileOutputStream f2=new FileOutputStream("SEnc.dat");
?
??????? f2.write(ctext);???
?
?????
?
?????? //發(fā)送
?
????? try {
?
?????????? //創(chuàng)建連接特定服務(wù)器的指定端口的Socket對象
?
??????? Socket socket = new Socket("192.168.253.1", 4431);
?
?????????????????? Socket socket1 = new Socket("192.168.253.1", 4430);
?
??????????? //獲得從服務(wù)器端來的網(wǎng)絡(luò)輸入流
?
??????????? BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
?
??????????? //獲得從客戶端向服務(wù)器端輸出數(shù)據(jù)的網(wǎng)絡(luò)輸出流
?
??????? PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
?
???????? ??? PrintWriter out1=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
?
??????????? //創(chuàng)建鍵盤輸入流,以便客戶端從鍵盤上輸入信息
?
??????????? //BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
?
??????????? System.out.print("讀取文件中...\n");?
?
??????????? FileInputStream f1=new FileInputStream("key1.dat");
?
???????? ??? FileInputStream f3=new FileInputStream("SEnc.dat");
?
??????????? //String str=stdin.readLine(); //從鍵盤讀入待發(fā)送的數(shù)據(jù)
?
??????????? String str;
?
??????????? out.println(f1);? //通過網(wǎng)絡(luò)傳送到服務(wù)器
?
???????? ??? out1.println(f3);
?
???????????
?
??????????? System.out.print("已發(fā)送\n");?
?
???????????
?
??????????? str=in.readLine();//從網(wǎng)絡(luò)輸入流讀取結(jié)果
?
??????????? System.out.println( "從服務(wù)器接收到的結(jié)果為:"+str); //輸出服務(wù)器返回的結(jié)果
?
?????? }
?
??????? catch (Exception v) {
?
??????????? System.out.println(v);
?
??????? }
?
?????????????????? finally{
?
??????????????????????????? //stdin.close();
?
??????????????????????????? //in.close();
?
??????????????????????????? //out.close();
?
??????????????????????????? //socket.close();????????????????????????
?
?????????????????? }
?
???? }
?
}
實(shí)驗(yàn)截圖:
四、實(shí)驗(yàn)總結(jié)
?本次實(shí)驗(yàn)是我和結(jié)對伙伴一起完成的。起初我們沒有任何的實(shí)驗(yàn)思路,后來我們通過請教了老師和做出來實(shí)驗(yàn)的同學(xué)梳理清了頭緒,明確了實(shí)驗(yàn)步驟和實(shí)驗(yàn)要求。把代碼組合起來對我們是個(gè)不小的挑戰(zhàn),不僅考驗(yàn)了我們的細(xì)心程度,還考察了DES算法和RSA加密,在網(wǎng)絡(luò)連接,傳送,反饋上也有很多很難的地方,遇到有問題的地方往往需要上網(wǎng)翻閱很多資料才能找到適合的解決方案,在對代碼的不斷調(diào)試、改進(jìn)、調(diào)試、改進(jìn)后編譯成功。
轉(zhuǎn)載于:https://www.cnblogs.com/vioczw/p/4570338.html
總結(jié)
以上是生活随笔為你收集整理的Java网络编程及安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Task的使用
- 下一篇: 如何用互联网上的广告来赚取广告费——有点