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

    北京电子科技学院(BESTI)

                  

    课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317

    成绩:             指导教师:娄嘉鹏             实验日期:2015.6.10

    实验密级:         预习程度:                     实验时间:15:30--18:00

    仪器组次:         必修/选修: 选修             实验序号:5

    实验名称: 实验五   Java网络编程及安全                                          

    实验目的与要求:

    1.掌握Socket程序的编写; 

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

    3.设计安全传输系统。        

     

    实验仪器:

    名称

    型号

    数量

    PC

    Lenovo

    1

    实验楼环境

    /

    1

    Eclipse

    /

    1

     

     一、实验内容

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

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

    3. 使用Git进行版本控制

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

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

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

     二、实验步骤

    1.思路

    混合密钥系统:

     

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

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

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

    服务器代码:

    package server;

     

    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 args[]) throws Exception {

           ServerSocket link = null;

           Socket socket = null;

           try {

               link = new ServerSocket(8080);// 创建服务器套接字

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

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

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

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

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

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

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

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

              

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

               String line = in.readLine();

               BigInteger cipher = new BigInteger(line);

               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();//mod n

               BigInteger m = cipher.modPow(d, n);//m=d (mod n)

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

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

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

               byte[] keykb = m.toByteArray();

     

               // 使用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;

        }

    }

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

     

    4.结对伙伴:20135337 朱荟潼

    负责客户端

    博客:http://www.cnblogs.com/zzzz5

     三、实验中遇到的问题

    1. 两台电脑一直无法联通

    刚开始我们用的IP地址是从网络上搜ip出来的地址,然后显示连接超时。之后用在命令行中用ipconfig查看地址,找到自己的IPv4地址,但是换上之后还是显示连接超时。

    之后我们不连接在cmcc-edu中,而是一台电脑连接网络然后放wifi给另一台电脑使用,然后再次连接两台电脑,连通。

    2. 显示连通了之后,客户端向服务器发送消息,但是显示有异常。将端口换了一个变成端口8080之后,再次连接发送消息,成功。

  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/hyq20135317/p/4567241.html
Copyright © 2011-2022 走看看