20145307第五次JAVA學習實驗報告

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

相關文章
相關標籤/搜索