20145328 《Java程序设计》实验五实验报告

实验名称

Java网络编程

实验内容

  1. 用书上的TCP代码,实现服务器与客户端。
  2. 客户端与服务器连接
  3. 客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端
  4. 客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。计算求得明文的Hash函数值,检查是否与传送过来的一致,如果一直,则表示匹配成功。

实验步骤

首先建立一个端口号启动服务器并与客户端相连,获得网络输入流与输出流对象的引用

接着使用服务器端RSA的私钥对DES的密钥进行解密,对秘钥进行解密之后使用DES对密文进行解密

然后计算解密后的hash值来确定解密是否正确

以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。

在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器了。

服务器代码

  1. package experiment_5;
  2. /**
  3. * Created by Administrator on 2016/5/6.
  4. */
  5. import java.net.*;
  6. import java.io.*;
  7. import java.security.*;
  8. import java.security.spec.*;
  9. import javax.crypto.*;
  10. import javax.crypto.spec.*;
  11. import javax.crypto.interfaces.*;
  12. import java.security.interfaces.*;
  13. import java.math.*;
  14. public class ComputeTCPServer{
  15. public static void main(String srgs[]) throws Exception
  16. {
  17. ServerSocket sc = null;
  18. Socket socket=null;
  19. try
  20. {
  21. sc= new ServerSocket(10001);//创建服务器套接字
  22. System.out.println("端口号:" + sc.getLocalPort());
  23. System.out.println("服务器已经启动...");
  24. socket = sc.accept(); //等待客户端连接
  25. System.out.println("已经建立连接");//获得网络输入流对象的引用
  26. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得网络输出流对象的引用
  27. PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
  28. //使用服务器端RSA的私钥对DES的密钥进行解密
  29. String aline2=in.readLine();
  30. BigInteger c=new BigInteger(aline2);
  31. FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
  32. ObjectInputStream b=new ObjectInputStream(f);
  33. RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
  34. BigInteger d=prk.getPrivateExponent();
  35. BigInteger n=prk.getModulus();
  36. BigInteger m=c.modPow(d,n);
  37. byte[] keykb=m.toByteArray();
  38. //使用DES对密文进行解密
  39. String aline=in.readLine();//读取客户端传送来的数据
  40. byte[] ctext=parseHexStr2Byte(aline);
  41. Key k=new SecretKeySpec(keykb,"DESede");
  42. Cipher cp=Cipher.getInstance("DESede");
  43. cp.init(Cipher.DECRYPT_MODE, k);
  44. byte []ptext=cp.doFinal(ctext);
  45. String p=new String(ptext,"UTF8");
  46. System.out.println("从客户端接收到信息为:"+p); //通过网络输出流返回结果给客户端
  47. //使用Hash函数检测明文完整性
  48. String aline3=in.readLine();
  49. String x=p;
  50. MessageDigest m2=MessageDigest.getInstance("MD5");
  51. m2.update(x.getBytes( ));
  52. byte a[ ]=m2.digest( );
  53. String result="";
  54. for (int i=0; i<a.length; i++)
  55. {
  56. result+=Integer.toHexString((0x000000ff & a[i]) |
  57. 0xffffff00).substring(6);
  58. }
  59. System.out.println(result);
  60. if(aline3.equals(result))
  61. {
  62. System.out.println("匹配成功");
  63. }
  64. out.println("匹配成功");
  65. out.close();
  66. in.close();
  67. sc.close();
  68. } catch (Exception e) {
  69. System.out.println(e);
  70. }
  71. }
  72. public static byte[] parseHexStr2Byte(String hexStr)
  73. {
  74. if (hexStr.length() < 1)
  75. return null;
  76. byte[] result = new byte[hexStr.length()/2];
  77. for (int i = 0;i< hexStr.length()/2; i++)
  78. {
  79. int high = Integer.parseInt(hexStr.substring(i*2, i*2+1 ), 16);
  80. int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
  81. result[i] = (byte) (high * 16 + low);
  82. }
  83. return result;
  84. }
  85. public static String parseByte2HexStr(byte buf[]) {
  86. StringBuffer sb = new StringBuffer();
  87. for (int i = 0; i < buf.length; i++)
  88. {
  89. String hex = Integer.toHexString(buf[i] & 0xFF);
  90. if (hex.length() == 1)
  91. {
  92. hex = '0' + hex;
  93. }
  94. sb.append(hex.toUpperCase());
  95. }
  96. return sb.toString();
  97. }
  98. }

心得体会

本次实验中主要涉及到的是关于java网络编程的内容,在阅读过那篇关于java网络编程的学习资料后对于代码的意思是可以理解的,而且大部分代码都是老师既定给好的,而我们的主要任务是对要实现的传输、加解密、连接等进行处理衔接。这次实验主要分为三个部分,一是多线程客户端和服务器的连接,而是RSA公钥加密,三是DES加密。主要的代码是从学长学姐那里拷来的,所以更多的是对代码进行理解。安全性检测也没去完善。

实验代码托管

代码托管地址在这里

PSP(Personal Software Process)时间:

步骤 耗时 百分比
需求分析 20min 12.5%
设计 40min 25%
代码实现 40min 25%
测试 30min 18.75%
分析总结 30min 18.75%

20145328 《Java程序设计》实验五实验报告的更多相关文章

  1. 20145222黄亚奇《Java程序设计》实验五实验报告

    20145222 <Java程序设计>实验五实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20 ...

  2. 20145315 《Java程序设计》实验五实验报告

    20145315 <Java程序设计>实验五实验报告 实验五 Java网络编程 我负责服务器部分,王嘉澜负责客户端部分:http://www.cnblogs.com/SJZGM10/p/5 ...

  3. 20145227 《Java程序设计》实验五实验报告

    20145227 <Java程序设计>实验五实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验过程 1.先运行TCP代码,一人服务 ...

  4. 20145120 《Java程序设计》实验五实验报告

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

  5. 20145314郑凯杰 《Java程序设计》实验五 实验报告

    20145314郑凯杰 <Java程序设计>实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...

  6. 20145330《Java程序设计》第一次实验报告

    20145330<Java程序设计>第一次实验报告 实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Ja ...

  7. 20145320《Java程序设计》第一次实验报告

    20145320<Java程序设计>第一次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 18: ...

  8. 20145317彭垚 《Java程序设计》第一次实验实验报告

    20145317彭垚 <Java程序设计>第一次实验实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验名称:Java开发环境的 ...

  9. #《JAVA程序设计》 20155214 实验五 网络编程与安全

    <JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...

随机推荐

  1. eclipse中的SVN文件还原到历史版本

    转载自:http://www.softown.cn/post/103.html 由于某些特殊原因,我们可能需要将SVN资源库中的某个文件回滚到以前的某个历史版本(准确地说,这不是"回滚&qu ...

  2. netty 网关 flume 提交数据 去除透明 批处理 批提交 cat head tail 结合 管道显示行号

    D:\javaNettyAction\NettyA\src\main\java\com\test\HexDumpProxy.java package com.test; import io.netty ...

  3. phpstrom 常用默认快捷键

    ctrl+j 插入活动代码提示ctrl+alt+t 当前位置插入环绕代码alt+insert 生成代码菜单ctrl+shift+n 查找文件 ctrl+q 查看代码注释ctrl+d 复制当前行ctrl ...

  4. YAML 语言

    1. YAML 介绍 YAML:以数据为中心,比JSON,XML更适合做配置文件; //示例: server: port: 8081 //此处有空格 2. YAML 基本语法 使用缩进表示层级关系; ...

  5. 解决Bat脚本中包含中文,运行乱码

    bat文件右键用“编辑” 打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行时乱码问题.

  6. Flowers---hdu4325(区间处理 离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:有n种花,每种花都有自己的开花时间段从S到E,有m个查询,每个查询都是一个时间点,求这一时 ...

  7. Pycharm建立web2py项目并简单连接MySQL数据库

    引言 web2py是一种免费的,开源的web开发框架,用于敏捷地开发安全的,数据库驱动的web应用:web2p采用Python语言编写,并且可以使用Python编程.web2py是一个完整的堆栈框架, ...

  8. mysql联合其他表做更新

    在sql server中,我们可是使用以下update语句对表进行更新: update a set a.xx= (select yy from b) where a.id = b.id ; 但是在my ...

  9. HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布

    经历了几个月的改进,终于发布1.0.0版了.虽然引擎依然存在漏洞,但是比起上次更新还是要好多了.在这里不得不感谢各位网友的大力支持. 首先为引擎做一个开场白吧,也好让大家了解一下它: lufylege ...

  10. Jmeter(三)断言和关联

    Jmeter断言 断言是什么呢,它是用来检查返回结果对不对的.用来验证结果是否正确,如果正确的话,就代表这个请求的返回是正确的,如果没有的话就代表这个请求的结果和我们预期的不一致,这样我们就可以通过断 ...