標籤:
一、實驗內容:
1.運行教材上TCP代碼,結對進行,一人伺服器,一人用戶端;
2.利用加解密程式碼封裝,編譯運行代碼,一人加密,一人解密;
3.整合代碼,一人加密後通過TCP發送;
註:加密使用AES或者DES/AES或者DES加密金鑰key並發送,使用伺服器的公開金鑰加密/公開金鑰演算法使用RSA或DH/檢驗發送資訊的完整性使用MD5或者SHA3;
4.用Git進資料列版本設定。
5.完成Blog
我的結對夥伴是20135126謝飛帆
我負責的是用戶端,謝飛帆負責的是伺服器
二、實驗步驟
1.資訊安全傳送:
| 發送方A——————>接收方B A加密時,用B的公開金鑰 B解密時,用B的私密金鑰 |
發送方A對資訊(明文)採用DES祕密金鑰加密,使用RSA加密前面的DES密鑰資訊,最終將混合資訊進行傳遞。同時用hash函數將明文進行用作驗證。
接收方B接收到資訊後,用RSA解密DES密鑰資訊,再用RSA解密擷取到的密鑰資訊解密密文資訊,最終就可以得到我們要的資訊(明文)。用hash函數對解出的明文進行驗證,與發送過來的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 {
//隨機密鑰產生
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("請輸入待發送的資料:");
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);
//發送
try {
//建立串連特定伺服器的指定連接埠的Socket對象
Socket socket = new Socket("192.168.253.1", 4431);
Socket socket1 = new Socket("192.168.253.1", 4430);
//獲得從伺服器端來的網路輸入資料流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//獲得從用戶端向伺服器端輸出資料的網路輸出資料流
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
PrintWriter out1=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//建立鍵盤輸入資料流,以便用戶端從鍵盤上輸入資訊
//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(); //從鍵盤讀入待發送的資料
String str;
out.println(f1); //通過網路傳送到伺服器
out1.println(f3);
System.out.print("已發送\n");
str=in.readLine();//從網路輸入資料流讀取結果
System.out.println( "從伺服器接收到的結果為:"+str); //輸出伺服器返回的結果
}
catch (Exception v) {
System.out.println(v);
}
finally{
//stdin.close();
//in.close();
//out.close();
//socket.close();
}
}
}
實驗:
四、實驗總結
本次實驗是我和結對夥伴一起完成的。起初我們沒有任何的實驗思路,後來我們通過請教了老師和做出來實驗的同學梳理清了頭緒,明確了實驗步驟和實驗要求。把程式碼群組合起來對我們是個不小的挑戰,不僅考驗了我們的細心程度,還考察了DES演算法和RSA加密,在網路連接,傳送,反饋上也有很多很難的地方,遇到有問題的地方往往需要上網翻閱很多資料才能找到適合的解決方案,在對代碼的不斷調試、改進、調試、改進後編譯成功。
Java網路編程及安全