實 驗 報 告算法
課程:移動平臺應用開發實踐 班級:201592 姓名:楊鳳 學號:20159213編程
成績:___________ 指導老師:婁嘉鵬 實驗日期 :2015.10.25安全
實驗名稱: Java 網絡編程及安全 服務器
實驗內容: 一、掌握 Socket程序的編寫 二、掌握密碼技術的使用 三、設計安全傳輸系統 網絡
個人實驗搭檔是孫楠 http://www.cnblogs.com/20159214sn/,客戶端由我負責,她負責服務端app
實驗步驟:socket
一、基於Java Socket實現安全傳輸post
二、給予TCP實現客戶端和服務器,結對編程一人負責客戶端一人負責服務器加密
三、使用Git進行版本控制
四、選擇對稱算法進行數據加密
五、選擇非對稱算法對對稱加密密鑰進行密鑰分發
六、選擇和蛇的Hash算法進行完整性驗證。
在本次試驗中我組用DES加密和RSA解密。
客戶端
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 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 socket = new Socket("192.168.80.1", 8028);
// 網絡輸入流
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;
}
}
兩臺機器實現的通訊
實驗總結
在本次試驗中,大體瞭解了Socket的功能和用法,不斷的調試代使兩臺計算機實現單向通訊,雖然代碼不是本身寫的但能實現通也是讓人很興奮,極大的激發了求知的慾望。本次實驗沒有解決的問題是,每次客戶端和服務端鏈接以後,再次鏈接就會出現問題,還的進行更換端口,這種通訊即浪費時間又浪費精力。下面是出現的問題
通過百度查詢,讓關閉運行端但也沒有解決問題。
另外一個問題是兩臺電腦必須在同一個網段才能鏈接成功。