实验五 Java网络编程及安全

一、实验内容

1.运行下载的TCP代码,结对进行,一人服务器,一人客户端;
2.利用加解密代码包,编译运行代码,一人加密,一人解密;
3.集成代码,一人加密后通过TCP发送;
4.结对伙伴:20145224陈颢文,我负责服务端,她负责客户端,博客地址:。

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

二、实验步骤

·运行TCP代码

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

运行结果如下

·查看自己的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值相等,验证通过。

服务端具体代码如下:

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 ComputeTCPServer {public static void main(String args[]) throws Exception {ServerSocket link = null;Socket socket = null;try {link = new ServerSocket(5288);// 创建服务器套接字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 nBigInteger 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;}}

服务端

实验中遇到的问题

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

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%

转载于:https://www.cnblogs.com/20145238jym/p/5471338.html

20145238-荆玉茗 《Java程序设计》第五次实验报告相关推荐

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

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

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

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

  3. c语言程序设计第五版实验报告九,C语言程序设计实验报告-实验九.doc

    C语言程序设计实验报告-实验九.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...

  4. Java模式设计卖电脑实验报告_20145310《Java程序设计》第2次实验报告

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

  5. java程序设计输入输出实验_20145320《Java程序设计》第五次实验报告

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

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

    20144303 <Java程序设计>第二次实验实验报告 北京电子科技学院(besti)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

  7. c语言程序设计编程解读,C语言程序设计第三次实验报告解读

    <C语言程序设计第三次实验报告解读>由会员分享,可在线阅读,更多相关<C语言程序设计第三次实验报告解读(15页珍藏版)>请在人人文库网上搜索. 1.C语言程序设计实验报告专业 ...

  8. C语言第五章实验原理,C语言第五章实验报告.docx

    C语言第五章实验报告 C语言第五章实验报告?班级:14金工3班??????????学号???????????姓名:周俐俐一.实验目的?1.?熟悉C语言编程环境.2.?进一步熟悉用C语言调试C语言源程序 ...

  9. c程序语言第四版实验报告,C语言程序设计第四次实验报告

    C语言程序设计第四次实验报告 姓名:熊毅 实验地点:家 实验时间:2020.04.09 实验项目: 5.3.1练习2 求数列的前n项和 5.3.2练习2 求水仙花数 5.3.4 十进制转换 5.3.5 ...

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

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

最新文章

  1. IAS的工作原理(一)作为 RADIUS 服务器的 IAS
  2. 3.2 选择最可能的句子-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. 绿色日期控件皮肤 My97 DatePicker
  4. 嵌入式开发笔记(二)嵌入式系统启动过程 (S5pv210)
  5. python的回收机制_Python的垃圾回收机制深入分析
  6. linux里车目录是什么意思,linux 命令整理
  7. boolean到底占几个字节?
  8. 大麦盒子显示服务器超时,大麦盒子卡顿怎么办?这几个方法可以快速解决
  9. PHP获取汉字笔画数功能
  10. 美女老师,大数据直播,老师做了什么,让全场尴尬。
  11. 广告投放系统数据表设计
  12. 影评分析第3篇 上映4天,票房7.4亿的《海王》,用数据看大片!
  13. 学习软件测试必备的网站清单,建议收藏!
  14. springboot2.2.6文件上传、下载及文件超出大小限制的处理
  15. Appium 真机测试
  16. ZCMU - 1931: wjw的剪纸
  17. 如何在ios app 局域网内搜索到设备
  18. css清除浮动的几种方式
  19. anaconda安装配置步骤、报错解决
  20. php顺丰bsp订单跟踪,顺丰BSP接口PHP开发注意事项

热门文章

  1. mysql集群 MySQL Cluster
  2. python打卡提醒机器人(企业微信)
  3. 4.20 视频面试字节_光大银行_神策
  4. ssm框架前后端数据交互完整示例
  5. android otg读写文件,Android USB Host在USB设备OTG中读/写文件
  6. PS制作两寸照片的疑惑
  7. html的li标签结合layui实现滚动列表
  8. 数据挖掘机器学习[六]---项目实战金融风控之贷款违约预测
  9. 图表Chart.js入门教程
  10. Halcon 卡尺找圆