20145307《Java程序設計》第五次實驗報告
北京電子科技學院(BESTI)實驗報告
課程:Java程序設計
班級:1453
指導教師:婁嘉鵬
實驗日期:2016.05.06
實驗名稱:
1、實驗內容
1.用書上的TCP代碼,實現服務器與客戶端。
2.客戶端與服務器鏈接
3.客戶端中輸入明文,利用DES算法加密,DES的祕鑰用RSA公鑰密碼中服務器的公鑰加密,計算明文的Hash函數值,一塊兒傳送給客戶端
4.客戶端用RSA公鑰密碼中服務器的私鑰解密DES的,祕鑰,用祕鑰對密文進行解密,得出明文。計算求得明文的Hash函數值,檢查是否與傳送過來的一致,若是一直,則表示匹配成功。
2、實驗要求
1.沒有Linux基礎的同窗建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如「查網絡」、「問同窗」、「看書」等一概得0分)以及分析(從中能夠獲得什麼啓示,有什麼收穫,教訓等)。報告能夠參考範飛龍老師的指導
3.嚴禁抄襲,有該行爲者實驗成績歸零,並附加其餘懲罰措施。
3、實驗步驟
基於Java Socket實現安全傳輸
基於TCP實現客戶端和服務器,結對編程一人負責客戶端,一人負責服務器
使用Git進行版本控制
利用DES算法進行數據加解密.
4、實驗過程
首先獲取服務器的ipv4地址
在命令行中輸入ipconfig便可
運行結果(以本機爲例)
建立鏈接特定服務器的指定端口的Socket對象
這裏輸入的是服務器的ip地址和端口號,端口號要注意和服務器保持一致。
Socket socket = new Socket("192.168.253.1", 9999);
將公鑰移動到src的同級文件夾中
將Skey_RSA_priv.dat\Skey_RSA_pub.dat兩個文件分別 拷到服務器和客戶端
本次實驗充當客戶端角色
使用服務器端RSA的私鑰對DES的密鑰進行解密,對密鑰進行解密以後使用DES對密文進行解密。
在服務器上先運行,顯示服務器已經啓動後,再在客戶端上運行。
實驗代碼以下
import java.net.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
public class TCP_Client
{
public static void main(String srgs[]) throws Exception
{
try
{
KeyGenerator kg = KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k = kg.generateKey();
byte[] ptext2 = k.getEncoded();
Socket socket = new Socket("192.168.253.1", 9999);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
FileInputStream f3 = new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b2 = new ObjectInputStream(f3);
RSAPublicKey pbk = (RSAPublicKey) b2.readObject();
BigInteger e = pbk.getPublicExponent();
BigInteger n = pbk.getModulus();
BigInteger m = new BigInteger(ptext2);
BigInteger c = m.modPow(e, n);
String cs = c.toString();
out.println(cs);
System.out.print("請輸入待發送的數據:");
String s = stdin.readLine();
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
byte ptext[] = s.getBytes("UTF8");
byte ctext[] = cp.doFinal(ptext);
String str = parseByte2HexStr(ctext);
out.println(str);
String x = s;
MessageDigest m2 = MessageDigest.getInstance("MD5");
m2.update(x.getBytes());
byte a[] = m2.digest();
String result = "";
for (int i = 0; i < a.length; i++)
{
result += Integer.toHexString((0x000000ff & a[i])| 0xffffff00).substring(6);
}
System.out.println(result);
out.println(result);
str = in.readLine();
System.out.println("從服務器接收到的結果爲:" + str);
}
catch (Exception e)
{
System.out.println(e);
}
finally
{
}
}
public static String parseByte2HexStr(byte buf[])
{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++)
{
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1)
{
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
public static byte[] parseHexStr2Byte(String hexStr)
{
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++)
{
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
}
java