zoukankan      html  css  js  c++  java
  • Java实验五(客户端)

    一、    实验内容

    1、    运行教材上TCP代码,结对进行,一人服务器,一人客户端;

    2、    利用加解密代码包,编译运行代码,客户端加密,服务器解密;

    3、    客户端加密明文后将密文通过TCP发送;

    4、    加密使用DES,DES加密密钥key发送至服务器,使用服务器的公钥加密,公钥算法使用RSA,检验发送信息的完整性使用MD5

     

    二、    实验步骤

    1. 本次实验中,需要两台PC机之间互联。一台PC机创建局域网,充当客户端,另一台连入局域网并查询自己的IP地址(ipconfig),充当服务器,然后运行服务器代码,即打开服务器。完成连接之后输入内容即可。

    2. 客户端。组合代码,首先需要连入服务器,其中需要修改IP地址和端口。然后创建密钥——按照服务器端口号请求连接——连接成功后传输数据——从键盘读入数据并加密——检查连接状态——请求关闭——关闭。

    三、    客户端代码

    // file name:ComputeTCPClient.java

    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 ComputeTCPClient {

        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();

                     //String kstr=parseByte2HexStr(kb);

              

               //创建连接特定服务器的指定端口的Socket对象

                     Socket socket = new Socket("192.168.1.2", 4421);

                //获得从服务器端来的网络输入流

                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();

                     //System.out.println("e= "+e);

                     //System.out.println("n= "+n);

                     //byte ptext2[]=kstr.getBytes("UTF8");

                     BigInteger m=new BigInteger(ptext2);

                     BigInteger c=m.modPow(e,n);

                     //System.out.println("c= "+c);

                     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{

                     //stdin.close();

                     //in.close();

                     //out.close();

                     //socket.close();              

               }

              

         }

           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; 

        } 

    }

    四、结果截图

    五、实验体会

          通过本次实验初次尝试了在两台PC之间传输加密信息。本次实验采用了RSA(Pub)算法对DES算法的密钥加密,采用DES算法对明文加密,采用HASH值验证信息的完整性。结对编程,实现了两台PC的信息互传,增强了团队意识。

  • 相关阅读:
    Floppy Disk Driver Primer
    王少川: 现阶段 我国没必要开发自己的操作系统
    Why does DOS use 100% CPU under Virtual PC?
    “情感计算”的危机与哲学错误
    [转载] 国产OS? 中文CPU?
    理想与现实的关系思考
    在Virtual PC 中安 装ms dos 6.22 的方法
    How Microsoft Lost the API War.
    svn 功能概览
    as3里的regex不需要转义
  • 原文地址:https://www.cnblogs.com/shadow135211/p/4570273.html
Copyright © 2011-2022 走看看