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

实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html

实验要求

  1. 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
  2. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

实验内容

1.

掌握Socket程序的编写;

  1. 掌握密码技术的使用;
  2. 设计安全传输系统。

实验知识点

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

原理图如下

插图一:

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

而接收方(本次实验为服务器)接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的明文。用hash函数对解出的明文进行验证,与发送过来的hash值相等,验证通过。稍后我将用"hello bitch"与我的搭档王亦徐进行沟通,接下来请看实验步骤:

实验步骤

本次实验伙伴20145311王亦徐

1、首先与王亦徐连上同一个WIFI,我们采用手机热点,稳定且相同的网络是做好本次实验的基础。

2、接着在王亦徐的命令行中输入ipconfig得到服务器的ip地址。

王亦徐IP:

3、GET到王亦徐的IP地址之后,我们就可以建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是刚刚获取的ip地址和双方默认的同一端口。我们端口号是9090。

因此,我们的Socket实例为:Socket socket = new Socket("172.26.168.2", 9090);

4、接着利用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。这部分直接可以用到老师给我们的代码,我是客户端,所以代码如下:

  1. package com.company;
  2. import java.net.*;
  3. import java.io.*;
  4. import java.security.*;
  5. import javax.crypto.*;
  6. import javax.crypto.spec.*;
  7. import java.security.spec.*;
  8. import javax.crypto.interfaces.*;
  9. import java.security.interfaces.*;
  10. import java.math.*;
  11. public class Main
  12. {
  13. public static void main(String srgs[]) throws Exception
  14. {
  15. try
  16. {
  17. KeyGenerator kg = KeyGenerator.getInstance("DESede");
  18. kg.init(168);
  19. SecretKey k = kg.generateKey();
  20. byte[] ptext2 = k.getEncoded();
  21. // 创建连接特定服务器的指定端口的Socket对象
  22. Socket socket = new Socket("172.26.168.2", 9090);//这里输入的是服务器的ip地址和端口号,端口号要注意和服务器保持一致。
  23. // 获得从服务器端来的网络输入流
  24. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  25. // 获得从客户端向服务器端输出数据的网络输出流
  26. PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
  27. // 创建键盘输入流,以便客户端从键盘上输入信息
  28. BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  29. //RSA算法,使用服务器端的公钥对DES的密钥进行加密
  30. FileInputStream f3 = new FileInputStream("Skey_RSA_pub.dat");
  31. ObjectInputStream b2 = new ObjectInputStream(f3);
  32. RSAPublicKey pbk = (RSAPublicKey) b2.readObject();
  33. BigInteger e = pbk.getPublicExponent();
  34. BigInteger n = pbk.getModulus();
  35. BigInteger m = new BigInteger(ptext2);
  36. BigInteger c = m.modPow(e, n);
  37. String cs = c.toString();
  38. out.println(cs); // 通过网络将加密后的秘钥传送到服务器
  39. //用DES加密明文得到密文
  40. System.out.print("请输入待发送的数据:");
  41. String s = stdin.readLine(); // 从键盘读入待发送的数据
  42. Cipher cp = Cipher.getInstance("DESede");
  43. cp.init(Cipher.ENCRYPT_MODE, k);
  44. byte ptext[] = s.getBytes("UTF8");
  45. byte ctext[] = cp.doFinal(ptext);
  46. String str = parseByte2HexStr(ctext);
  47. out.println(str); // 通过网络将密文传送到服务器
  48. // 将客户端明文的Hash值传送给服务器
  49. String x = s;
  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]) | 0xffffff00).substring(6);
  57. }
  58. System.out.println(result);
  59. out.println(result);//通过网络将明文的Hash函数值传送到服务器
  60. str = in.readLine();// 从网络输入流读取结果
  61. System.out.println("从服务器接收到的结果为:" + str); // 输出服务器返回的结果
  62. }
  63. catch (Exception e)
  64. {
  65. System.out.println(e);//输出异常
  66. }
  67. finally
  68. {
  69. }
  70. }
  71. public static String parseByte2HexStr(byte buf[])
  72. {
  73. StringBuffer sb = new StringBuffer();
  74. for (int i = 0; i < buf.length; i++)
  75. {
  76. String hex = Integer.toHexString(buf[i] & 0xFF);
  77. if (hex.length() == 1)
  78. {
  79. hex = '0' + hex;
  80. }
  81. sb.append(hex.toUpperCase());
  82. }
  83. return sb.toString();
  84. }
  85. public static byte[] parseHexStr2Byte(String hexStr)
  86. {
  87. if (hexStr.length() < 1)
  88. return null;
  89. byte[] result = new byte[hexStr.length() / 2];
  90. for (int i = 0; i < hexStr.length() / 2; i++)
  91. {
  92. int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
  93. int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
  94. 16);
  95. result[i] = (byte) (high * 16 + low);
  96. }
  97. return result;
  98. }
  99. }

5、得到了明文就可以将客户端明文的Hash值传送给服务器,然后会收到来自服务器的返回数据

6、实验就成功了:

成功 王亦徐:

成功 郑凯杰:

实验中的问题和解决过程

1、第一个遇到的问题是WIFI问题

如果双方连接CMCC-EDU的话,成功率是比较低的。

就会出现连接超时的问题:

失败:

这是由于有些端口已被占用,这时候我们可以用以下三种方法解决这个问题:

①可以用老师上传给我们的XAMPP软件,查看已被使用的端口十分方便。

②可以在命令行中输入netstat -na就能看到当前的端口号的占用情况。

③连接私人WIFI,即手机热点,成功率暴涨。

2、文件缺失问题

相信大家第一次做都会出现如下情况:

失败 缺失文件:

我们只要将老师给我们的文件拷入JDK目录下即可:

找不到文件解决:

实验代码托管截图

代码:

其他(感悟、思考等,可选)

最后一次JAVA实验,这次的实验实用性比较强,而且结合了本周学习内容——网络编程。实验与知识契合度高的话做起来也比较快。本次实验找到了搭档王亦徐,配合起来也比较快,一对一进行实验,对于处理和分析问题,效率大大提高。两个人也对同一个问题有着不同的解决方法,所以今天的解决方法比较多。相信下周开始做项目之后会取得更好的效果!

PSP

PSP:

20145314郑凯杰 《Java程序设计》实验五 实验报告的更多相关文章

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

    20145314郑凯杰 <Java程序设计>实验四 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

  2. 20145314郑凯杰 《Java程序设计》实验三 敏捷开发与XP实践实验报告

    20145314郑凯杰 <Java程序设计>实验二 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

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

    20145314郑凯杰 <Java程序设计>实验二 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

  4. 20145314郑凯杰 《Java程序设计》实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告

    20145314郑凯杰 <Java程序设计>实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告 实验要求 •使用JDK编译.运行简单的Java程序: •使用Ecl ...

  5. 20145314郑凯杰 《Java程序设计》课程总结

    20145314郑凯杰 <Java程序设计>课程总结 每周读书笔记链接汇总 ①寒假预习--"helloworld" ②第一周读书笔记 ③第二周读书笔记 ④第三周读书笔记 ...

  6. 20145314郑凯杰 《Java程序设计》第8周学习总结

    20145314郑凯杰 <Java程序设计>第8周学习总结 教材学习内容总结 代码已托管 第十五章 通用API ①日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用到日志信息 使 ...

  7. 20145314郑凯杰 《Java程序设计》第7周学习总结

    20145314郑凯杰 <Java程序设计>第7周学习总结 教材学习内容总结 首先放上代码托管图片和本地代码图片: 插图4: 插图5: 插图6: 第十三章 时间与日期 13.1 认识时间与 ...

  8. 20145314郑凯杰 《Java程序设计》第3周学习总结

    20145314郑凯杰 <Java程序设计>第3周学习总结 所有代码均已托管 地址https://git.oschina.net/qiaokeli26/codes 按照下面程序结果中的代码 ...

  9. 20145314郑凯杰 《Java程序设计》第10周学习总结

    20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...

随机推荐

  1. ie8兼容:对象不支持“trim”属性或方法

    trim() 方法是原生js中去空格的方法,高版本浏览器已经默认支持trim() 方法,但ie8以下不支持,会报错:对象不支持“trim”属性或方法 解决这个的兼容,只需要扩展String原型属性 在 ...

  2. pageResponse - 让H5适配移动设备全家

    http://www.cnblogs.com/PeunZhang/p/4517864.html

  3. Vue-cli 安装使用和理解

    Vue 的 官方文档 提到 点开这个链接,跟着文档一步步直到: $ npm install -g vue-cli $ vue init webpack my-project $ cd my-proje ...

  4. Jmeter--压测dubbo接口

    Dubbo Interface Demo:https://blog.csdn.net/qi_lin7/article/details/53759528 Demo2:https://blog.csdn. ...

  5. plsql连接其他服务器的oracle

    plsql除了连接本地的oracle还需要连接其他服务器上的oracle时 1.下载安装oracleClient:2.在oracleClient安装目录下:例如:D:/instantclient_11 ...

  6. jQuery控制checkbox选中状态但是不显示选中

    问题描述:使用jQuery来控制checkbox的选中状态,但是第一次点击出现选中样式,之后点击可以看到checked的属性增加成功但是并没有选 中状态. 问题代码: function chooseA ...

  7. 2017 Multi-University Training Contest - Team 2——HDU6045&&HDU6047&&HDU6055

    讲一下这场多校赛里面比较简单的三个题 HDU6045  Is Derek lying? 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6045 题意:有 ...

  8. Myeclipse下配置struts2和hibernate

    最近维护一个项目,是用struts2做的,所以特意学了下struts的入门,否则代码都看不懂啊.下面记录下过程.Myeclipse 版本为2014.struts2,hibernate为4.1. 1.既 ...

  9. (2.1)备份与还原--sql server文件的概念及操作

    概述:sql server是以文件形式存储数据与日志 1.数据文件 sql server数据文件分为2类 (1)主数据库文件 主数据库文件包含数据库的启动信息.系统对象,并指向数据库的其他文件(从数据 ...

  10. Spark机器学习系列之13: 支持向量机SVM

    Spark 优缺点分析 以下翻译自Scikit. The advantages of support vector machines are: (1)Effective in high dimensi ...