实验五

学号20145332 《Java程序设计》实验五

实验内容

TCP代码的结对完成,一人服务器,一人客户端。

结对队友:20145313张雪纯http://www.cnblogs.com/entropy/

服务器代码:

import java.net.*;

import java.io.*;

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.crypto.interfaces.*;

import java.security.interfaces.*;

import java.math.*;

public class Server{

public static void main(String srgs[]) throws Exception {

    ServerSocket sc = null;

    Socket socket=null;

    try {

        sc= new ServerSocket(4421);//创建服务器套接字

        System.out.println("端口号:" + sc.getLocalPort());

        System.out.println("服务器已经启动...");

        socket = sc.accept();   //等待客户端连接

        System.out.println("已经建立连接");

        //获得网络输入流对象的引用

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        ////获得网络输出流对象的引用

        PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);



        //解密模块,最后的keykb即明文;使用Dec_RSA代码

        String aline2=in.readLine();

        BigInteger c=new BigInteger(aline2);

        FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");

        ObjectInputStream b=new ObjectInputStream(f);

        RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

        BigInteger d=prk.getPrivateExponent();

        BigInteger n=prk.getModulus();

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

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

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

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

        byte[] keykb=m.toByteArray();

        //String aline3=new String(mt,"UTF8");

        //String aline3=parseByte2HexStr(byte buf[]);



        //源自SDec代码,用于解密

        String aline=in.readLine();//读取客户端传送来的数据

        //FileInputStream  f2=new FileInputStream("keykb1.dat");

        //int num2=f2.available();

        //byte[] keykb=new byte[num2];

        //f2.read(keykb);

        byte[] ctext=parseHexStr2Byte(aline);

        Key k=new  SecretKeySpec(keykb,"DESede");

        Cipher cp=Cipher.getInstance("DESede");

        cp.init(Cipher.DECRYPT_MODE, k);

        byte []ptext=cp.doFinal(ctext);



        String p=new String(ptext,"UTF8");

        System.out.println("从客户端接收到信息为:"+p); //通过网络输出流返回结果给客户端



                               /*String aline2=in.readLine();

                               BigInteger c=new BigInteger(aline2);

                               FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");

                               ObjectInputStream b=new ObjectInputStream(f);

                               RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

                               BigInteger d=prk.getPrivateExponent();

                               BigInteger n=prk.getModulus();

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

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

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

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

                               byte[] mt=m.toByteArray();

                               //String aline3=new String(mt,"UTF8");*/



        //代码源自DigestCalc,用于检验信息完整性

        String aline3=in.readLine();

        String x=p;

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



        //输出结果

        if(aline3.equals(result)){

            System.out.println("匹配成功");

        }



        out.println("匹配成功");

        out.close();

        in.close();

        sc.close();

    } catch (Exception e) {

        System.out.println(e);

    }

}

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;

}

}

结果截图:

posted @ 2016-05-08 22:14  20145332卢鑫  阅读(153)  评论(1编辑  收藏  举报