20145306 第五次 java 实验报告

实验内容

  1. 客户端与服务器连接,客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端,客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。计算求得明文的Hash函数值,检查是否与传送过来的一致,如果一直,则表示匹配成功。
  2. 信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。而接收方接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得明文。
  3. *查看ip地址 和端口号占用情况:

  4. *客户端代码:
    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.*;
    /**
     * Created by Think on 2016/5/6.
     */
    public class Client
    {
        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();
  5.             // 创建连接特定服务器的指定端口的Socket对象
                Socket socket = new Socket("192.168.43.35", 10001);//这里输入的是服务器的ip地址和端口号,端口号要注意和服务器保持一致。
  6.             // 获得从服务器端来的网络输入流
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  7.             // 获得从客户端向服务器端输出数据的网络输出流
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
  8.             // 创建键盘输入流,以便客户端从键盘上输入信息
                BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  9.             //RSA算法,使用服务器端的公钥对DES的密钥进行加密
                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();
                BigInteger m = new BigInteger(ptext2);
                BigInteger c = m.modPow(e, n);
                String cs = c.toString();
                out.println(cs); // 通过网络将加密后的秘钥传送到服务器
  10.             //用DES加密明文得到密文
                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); // 通过网络将密文传送到服务器
  11.             // 将客户端明文的Hash值传送给服务器
                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);//通过网络将明文的Hash函数值传送到服务器
  12.             str = in.readLine();// 从网络输入流读取结果
                System.out.println("从服务器接收到的结果为:" + str); // 输出服务器返回的结果
            }
            catch (Exception e)
            {
                System.out.println(e);//输出异常
            }
            finally
            {
  13.         }
  14.     }
  15.     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();
        }
  16.     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;
        }
    }
  17. *运行截图:

实验中遇到的问题

几次链接不成功,将端口号更改后成功链接。

第五次实验报告 java 网络编程的更多相关文章

  1. Java课程实验报告 实验四 Java网络编程及安全

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计     班级:1352     姓名:吕松鸿  学号:20135229 成绩:               ...

  2. 20145122《 Java网络编程》实验五实验报告

    实验名称 Java网络编程 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 结对小伙伴 20145120黄玄曦 博客地址:http://www.cnblo ...

  3. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  4. Java实验报告五:Java网络编程及安全

    Java实验报告五:Java网络编程及安全                                                                               ...

  5. 20145211 《Java程序设计》实验报告五————Java网络编程及安全实验报告

    实验内容 1.掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 这一部分是与我的partner合作的,详见他的博客- [20145326 <Java程序设计> ...

  6. 20155227 《Java程序设计》实验五 Java网络编程及安全实验报告

    20155227 <Java程序设计>实验五 Java网络编程及安全实验报告 实验内容 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能. 编写MyDC.java实现从上面 ...

  7. 20155305 2016-2017-2 《Java程序设计》 实验五 Java网络编程及安全实验报告

    20155305 2016-2017-2 <Java程序设计> 实验五 Java网络编程及安全实验报告 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传 ...

  8. 20145219 《Java程序设计》实验五 Java网络编程及安全实验报告

    20145219 <Java程序设计>实验五 Java网络编程及安全实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和2 ...

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

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

随机推荐

  1. css3学习总结7--CSS3 2D转换

    CSS3 转换 通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D 转换 在本次,您将学到如下 2D 转换方法: 1. translate() 2. rotate() 3. ...

  2. 【读书笔记】读《JavaScript设计模式》之门面模式

    一.前言 门面模式,也称Facade(外观)模式.核心的两点作用—— 1> 简化类的接口(让接口变得更加容易理解.容易应用.更加符合对应业务),来掩盖一个非常不同或者复杂的实现 2> 消除 ...

  3. CentOS 6.5 下安装 Kibana5

    1. 导入Elastic PGP Key 执行命令 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 2. 安装Kiban ...

  4. Redis经验谈

    新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验.本文作者来自新浪,希望能为业界提供一些亲身经历,让大家少走弯路. 使用初衷 从2010年上半年起,我们就开始尝试使用Redis,主要 ...

  5. NVelocity模板引擎的使用

    第一种使用方法直接赋值: VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants ...

  6. linq lambda GroupBy 用法

    Linq 中按照多个值进行分组(GroupBy)   /// <summary>要查询的对象</summary> class Employee { public int ID ...

  7. HTML5 Socket通信

    HTML5 Socket通信使用起来也是相当不从的,先将部分JS代码与大家分享: var socket; function connect() { var host = "ws://&quo ...

  8. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  9. 获取MSSQL Server中的相关信息(视图、存储过程、触发器、表)

    在SQL SERVER得到某个数据库下面所有的表.视图.存储过程.触发器 select name from sysobjects where xtype='TR' --所有触发器select name ...

  10. C# 中Datetime类用法总结

    收集了一些记录下来,这些有的是从网上找的,有些是自己使用到的: DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25dt.ToF ...