实验五 Java网络编程及安全

一、实验内容

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

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

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

4.结对伙伴:20145224陈颢文,我负责服务端,她负责客户端,博客地址:。

  1. 注:加密使用AES或者DES/AES或者DES加密密钥key并发送,使用服务器的公钥加密/公钥算法使用RSADH/检验发送信息的完整性使用MD5或者SHA3

二、实验步骤

·运行TCP代码

  1. import java.net.*;
  2. import java.io.*;
  3. public class ComputeTCPClient {
  4. public static void main(String srgs[]) {
  5. try {
  6. //创建连接特定服务器的指定端口的Socket对象
  7. Socket socket = new Socket("127.0.0.1", 4421);
  8. //获得从服务器端来的网络输入流
  9. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  10. //获得从客户端向服务器端输出数据的网络输出流
  11. PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
  12. //创建键盘输入流,以便客户端从键盘上输入信息
  13. BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  14. System.out.print("请输入待发送的数据:");
  15. String str=stdin.readLine(); //从键盘读入待发送的数据
  16. out.println(str); //通过网络传送到服务器
  17. str=in.readLine();//从网络输入流读取结果
  18. System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果
  19. }
  20. catch (Exception e) {
  21. System.out.println(e);
  22. }
  23. finally{
  24. //stdin.close();
  25. //in.close();
  26. //out.close();
  27. //socket.close();
  28. }
  29. }
  30. }
  1. import java.net.*;
  2. import java.io.*;
  3. public class ComputeTCPServer{
  4. public static void main(String srgs[]) {
  5. ServerSocket sc = null;
  6. Socket socket=null;
  7. try {
  8. sc= new ServerSocket(4421);//创建服务器套接字
  9. System.out.println("端口号:" + sc.getLocalPort());
  10. System.out.println("服务器已经启动...");
  11. socket = sc.accept(); //等待客户端连接
  12. System.out.println("已经建立连接");
  13. //获得网络输入流对象的引用
  14. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  15. ////获得网络输出流对象的引用
  16. PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
  17. String aline=in.readLine();//读取客户端传送来的数据
  18. System.out.println("从客户端接收到信息为:"+aline); //通过网络输出流返回结果给客户端
  19. out.println("Echo:" + aline);
  20. out.close();
  21. in.close();
  22. sc.close();
  23. } catch (Exception e) {
  24. System.out.println(e);
  25. }
  26. }
  27. }

运行结果如下



·查看自己的IP地址为:222.28.128.64



与小伙伴确认联通

·建立Socket对象

getInetAddress(): 获得远程服务器的IP 地址.

getPort(): 获得远程服务器的端口.

getLocalAddress(): 获得客户本地的IP 地址.

getLocalPort(): 获得客户本地的端口.

getInputStream(): 获得输入流. 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownInput() 方法关闭输入流, 那么此方法会抛出IOException.

getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.

• 密钥的加密:

发送方A——>接收方B

A加密时,用B的公钥

B解密时,用B的私钥

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

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

服务端具体代码如下:

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

服务端

实验中遇到的问题

·在运行老师给的代码时我和室友同时运行,IDEA显示

  1. java.net.SocketException:Connection address in used```

解决:

因为代码是老师给的所以连接时所使用的是同一个端口,只能允许一个人占用。

实验感想与体会

本次实验,我们需要做的工作就是将老师所给的代码加以整合,但自己真正编译代码还是有很大的困难,通过本次实验我了解到,很多加密算法在java中调用即可,大大减化工作的复杂性,不仅要学好java,更重要的是学会如何使用。

PSP(Personal Software Process)

步骤 耗时 百分比
需求分析 2 mins 10%
设计 4 mins 20%
代码实现 8 mins 40%
测试 6 mins 30%
分析总结 10 mins 50%

20145238-荆玉茗 《Java程序设计》第五次实验报告的更多相关文章

  1. #20145238荆玉茗《网络对抗》-逆向及Bof进阶实践

    20145238荆玉茗<网络对抗>-逆向及Bof进阶实践 实践目的:注入shellcode 准备一段shellcode代码 Shellcode实际是一段代码(也可以是填充数据),是用来发送 ...

  2. 20145240 《Java程序设计》第二次实验报告

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

  3. 20145330《Java程序设计》第二次实验报告

    20145330<Java程序设计>第二次实验报告 实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承多态 3.初步掌握UM ...

  4. 20145320《Java程序设计》第二次实验报告

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

  5. 《Java程序设计》第二次实验报告

    20145220 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测 ...

  6. 20145333 《Java程序设计》第二次实验报告

    2014333 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测试 ...

  7. Java程序设计第四次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

  8. 20145216史婧瑶《Java程序设计》第二次实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  9. 20145231《Java程序设计》第二次实验报告

    实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD: 理解并掌握面向对象三要素: 初步掌握UML建模: 熟悉S.O.L.I.D原则: 了解设计模式: 实验要求 实现并体会例子中代码的 ...

  10. 20145330《Java程序设计》第五次实验报告

    20145330<Java程序设计>第五次实验报告 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统 4.结队伙伴 ...

随机推荐

  1. sf04_操作系统中 heap 和 stack 的区别

    概述 本文分三部分,描述有所重叠,但可以让你对栈与堆有一个比较清晰.全面的认识 heap 和 stack是什么 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top) ...

  2. 《mac的git安装手册-2》

    <mac的git安装手册-2> 下载地址 https://git-scm.com/downloads 如果遇到打不开的情况,请在系统偏好设置内——>安全性与隐私下 ——>选择仍 ...

  3. DOM, DOCUMENT, BOM, WINDOW 有什么区别?

    DOM: DOM 全称是 Document Object Model,也就是文档对象模型. DOM 就是针对 HTML 和 XML 提供的一个API.什么意思?就是说为了能以编程的方法操作这个 HTM ...

  4. 在Application_Error获取Asp.Net未处理异常信息

    在Application_Error获取Asp.Net未处理异常信息 protected void Application_Error(object sender, EventArgs e) { // ...

  5. Qt 学习

    Qt 学习 C++ 模版 QObject 提供一个十分有用的 api,T findChild(QString, Qt::FindChildOptions),这个函数接收一个模版参数,返回模版参数的类型 ...

  6. HDU 5442——Favorite Donut——————【最大表示法+kmp | 后缀数组】

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  7. C#使用MediaInfo查看媒体信息

    1.将MediaInfo.dll放入可执行目录. 2.将官网Demo里的MediaInfoDLL.cs放入项目中.(http://mediainfo.sourceforge.net/en/Downlo ...

  8. c#-day04学习笔记

    面向对象 类与对象: C#的类和对象是用于在程序中模拟现实生活中的事务的 C#中的类是一种数据类型,用来定义对象的类型的 C#的对象是类的实例,是基于[给定数据类型]的具体的一个实例 小结: 类是对象 ...

  9. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

    本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...

  10. Oracle 求昨天 上个月 去年 日期

    到公司发现有一个报表没有收到,查看后发现原来是Oracle数据源异常. ' day, 'yyyyMMdd') AS enddata FROM DUAL; 上面这个sql求上个月今天和昨天.一般情况下不 ...