• 实验五


    学号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;
    
    }
    

    }

    结果截图:

  • 相关阅读:
    1.2基础--对象属性操作检测遍历
    C语言概览
    测试博客园字体
    c语言指针理解,指针的概念和演示指针的简单操作2
    c语言指针理解代码示例_函数返回指针变量_解除运算符获取指针的值
    c语言指针理解,指针的概念和演示指针的简单操作
    c语言指针概念解释_初步
    项目对文件分目录的感想
    visual studio快捷键
    java开源项目RuoYi若依管理系统
  • 原文地址:https://www.cnblogs.com/lx20145332/p/5471883.html
Copyright © 2020-2023  润新知