zoukankan      html  css  js  c++  java
  • JAVA课程实验报告 实验五 JAVA网络编程及安全

    JAVA课程实验报告 实验五 JAVA网络编程及安全

    实验目的与要求:

    1.掌握Socket程序的编写;

    2.掌握密码技术的使用;

    3.设计安全传输系统。

    一、实验内容

    1. 基于Java Socket实现安全传输

    2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器

    3. 使用Git进行版本控制

    4. 选择对称算法进行数据加解密.

    5. 选择非对称算法对对称加密密钥进行密钥分发.

    6. 选择合适的Hash算法进行完整性验证.

    二、实验步骤

    1.思路

    混合密钥系统:

     信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。

      而接收方接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)。用hash函数对解出的明文进行验证,与发送过来的hash值相等,验证通过。

    2.使用书上的客户端和服务器代码与老师给的代码组合,实现上述功能。

    服务器代码:

    package Client;
    
    // file name��ComputeTCPClient.java
    import java.net.*;
    
    import java.io.*;
    
    public class ComputeTCPClient
    
    {
    public static void main(String srgs[]) {
        try {
            Socket socket = new Socket("127.0.0.1", 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));
            System.out.print("请输入待发送的数据:");
            String str=stdin.readLine();
            Enc_RSA encode = new Enc_RSA(str);
            String s=encode.encodedata;
    
            out.println(s);
            str=in.readLine();
            System.out.println( "从服务器接收到的结果为:"+str);
        }
        catch (Exception e) {
            System.out.println(e);
        }
        finally{
            //stdin.close();
            //in.close();
            //out.close();
            //socket.close();
        }
    }
    }
    

    使用服务器端RSA的私钥对DES的密钥进行解密
    package Client;

    import java.io.*;
    
    import java.math.BigInteger;
    
    import java.security.interfaces.RSAPublicKey;
    
    public class Enc_RSA {
    public String encodedata="";
    public Enc_RSA(String s) throws Exception{
        FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
        BigInteger e=pbk.getPublicExponent();
        BigInteger n=pbk.getModulus();
        byte ptext[]=s.getBytes("UTF8");
        BigInteger m=new BigInteger(ptext);
        BigInteger c=m.modPow(e,n);
        String cs=c.toString( );
        encodedata=cs;
    }
    }
    

    使用DES对密文进行解密

           String readline = in.readLine();//读取客户端传送来的数据
    
           FileInputStream f2 = new FileInputStream("keykb1.dat");
    
           int num2 = f2.available();
    
           byte[] ctext = parseHexStr2Byte(readline);
    
           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); //打印解密结果
    

    使用Hash函数检测明文完整性

           String aline3 = in.readLine();
    
           String x = p;
    
           MessageDigest m2 = MessageDigest.getInstance("MD5");//使用MD5算法返回实现指定摘要算法的 MessageDigest对象
    
           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();
    
           link.close();
    
       } catch (Exception e) {
    
           System.out.println(e);
    
       }
    
    }
    

    二进制转换成十六进制,防止byte[]数字转换成string类型时造成的数据损失

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

    链接成功,接收信息解密信息成功,匹配成功

    实验报告中统计自己的PSP(Personal Software Process)时间

    步骤 耗时 百分比
    需求分析 40分钟 21.1%
    设计 20分钟 10.5%
    代码实现 60分钟 31.6%
    测试 40分钟 21.1%
    分析总结 30分钟 15.8%
  • 相关阅读:
    jpa命名规则 jpa使用sql语句 @Query
    spring data jpa 查询No property ... found for...Did you mean '...'?
    maven配置sqlServer的依赖
    SpringBoot 使用Swagger2打造在线接口文档(附汉化教程)
    本地git库gitlab库链接服务器库 idea git 配置 gitlab 配置 git生成ssh公钥
    连接sqlServer数据库&jpa调用存储过程Java获取存储过程返回的多个结果集JAVA调用sqlserver存储过程的实现(返回多个结果集的实现)jdbc多结果集(getMoreResults)
    Springmvc的handler method参数绑定常用的注解
    Java map 详解
    Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解
    @Controller和@RestController的区别
  • 原文地址:https://www.cnblogs.com/cy1123/p/5471836.html
Copyright © 2011-2022 走看看