實驗五 Java網絡編程及安全

   北京電子科技學院java

實      驗      報      告算法

課程:移動平臺應用開發實踐  班級: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的功能和用法,不斷的調試代使兩臺計算機實現單向通訊,雖然代碼不是本身寫的但能實現通也是讓人很興奮,極大的激發了求知的慾望。本次實驗沒有解決的問題是,每次客戶端和服務端鏈接以後,再次鏈接就會出現問題,還的進行更換端口,這種通訊即浪費時間又浪費精力。下面是出現的問題

 

通過百度查詢,讓關閉運行端但也沒有解決問題。

另外一個問題是兩臺電腦必須在同一個網段才能鏈接成功。

相關文章
相關標籤/搜索