20145210实验五《Java网络编程》

实验内容

1.运行下载的TCP代码,结对进行,一人服务器,一人客户端;

2.利用加解密代码包,编译运行代码,一人加密,一人解密;

3.集成代码,一人加密后通过TCP发送;

4.结对伙伴:20145231 熊梓宏

负责客户端

博客:http://home.cnblogs.com/u/xzh20145231/

实验步骤

1.信息安全传送:

发送方A——————>接收方B

A加密时,用B的公钥

B解密时,用B的私钥

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

•接收方B接收到信息后,用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.链接结果如下:

实验中遇到的问题

•传输文件位置不正确,导致系统找不到指定文件

解决:key.txt应该保存在该Java项目目录下

•无法连接

原因:端口号和ip地址不匹配

PSP(Personal Software Process)时间

20145210实验五《Java网络编程》的更多相关文章

  1. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  2. 20145206《Java程序设计》实验五Java网络编程及安全

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

  3. 20145337实验五Java网络编程及安全

    20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...

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

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

  5. 20145225《Java程序设计》 实验五 Java网络编程及安全

    20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...

  6. 20145208 实验五 Java网络编程

    20145208 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  7. 20145215实验五 Java网络编程及安全

    20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...

  8. 20145220 实验五 Java网络编程

    20145220 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  9. 20145203 实验五 Java网络编程及安全

    20145203 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.基于Java Socket实现安全传输 2 ...

  10. 实验五Java网络编程及安全

    实验五 Java网络编程及安全 结对伙伴:20135231林涵锦(负责服务器方)http://www.cnblogs.com/20135213lhj/  实验目的与要求: 1.掌握Java网络编程的方 ...

随机推荐

  1. C#语言基础——7月21日

    C#语言基础 一.语言基础 (一).函数的四要素:      名称,输入,输出,加工(二).主函数.输出语句.输入语句:     Static void Main(string[] args)//下划 ...

  2. backbonejs中的模型篇(二)

    一:模型标识符 每个模型都有一个用作唯一标识符的ID属性,以便在不同模型间进行区分.通过id属性我们可以直接访问模型对象当中用于标识符存放的属性,默认属性名为id,但也可以通过设置idAttribut ...

  3. MYSQL 日期函数【转】

    MySQL日期时间函数大全 DAYOFWEEK(date) 返回日期date是星期几(=星期六,ODBC标准) mysql> select DAYOFWEEK('1998-02-03'); WE ...

  4. 【模板下载】innosetup 制作.net安装包的模板

    NetworkComms网络通信框架序言 这个模板是在博客园和CodeProject上的代码修改而成的,感谢原作者 模板是2个 innosetup 制作.net 2.0 安装包的模板 innosetu ...

  5. ExecuteNonQuery()返回值注意点

    在使用ExecuteNonQuery(),调用存储过程,语句执行无错误,但是返回结果一直是-1 原因: 当使用储存过程时, 要把SET NOCOUNT ON  这个语句去掉, 这样数据就有反回值了 当 ...

  6. Hibernate的generator属性之意义

    Hibernate的generator属性之意义 本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. Hib ...

  7. 二模 (3) day2

    第一题: 题目大意:(难以概括,就不贴了把.) 解题过程: 1.担心被精度问题恶心,就把平均数的地方乘了N,这样只有最后计算的时候才会是小数.. 2.数组保存的时候蛋疼的 没改成double.结果全部 ...

  8. C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)

    准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...

  9. ZOJ3675:Trim the Nails

    Robert is clipping his fingernails. But the nail clipper is old and the edge of the nail clipper is ...

  10. 2、IValueConverter应用

    1.C#代码如下: public class logotoimgConverter:IValueConverter { //将logo转换为URI public object Convert(obje ...