信息的安全传输(JAVA实现信息的安全传输工具)

本文介绍了使用JAVA通过WebSocket实现点对点信息传输工具的设计与实现,确保信息的保密性、完整性和不可否认性。程序涉及到RSA、DES和MD5的加密解密操作,以及多线程处理。通过启动服务端,客户端连接并加密传输文件,最终在接收端解密验证信息的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信息的安全传输,实现信息的安全传输工具

概要设计及需求

设计与实现一款局域网中点到点(即一台计算机到另外一台计算机)的信息传输工具,要求能够保证信息在传输过程中的保密性、完整性和发送/接收方的不可否认性,以防止通信线路上的窃听、泄露、破坏、篡改等不良操作。

程序工作流程及原理

流程图

在这里插入图片描述

包结构图

在这里插入图片描述

程序原理:

FileTransferServer类封装了WebSocket的服务器端,即为接受方B
FileTransferClient类封装了WebSocket的客户端,即为发送方A。
业务层实现了程序的主体功能,即 对于A:建立连接,加密,签名,打包文件,发送文件;对于B:接收文件,解密,验证签名。

整体工程量较大,首先要用WebSocket完善A与B的正常通信,其次涉及到密码学的知识,基本完成了 RSA 、DES和MD5的功能,包括加密字符串,加密文件,生成密钥,对文件生成摘要,生成签名等等,涉及到了大量的I/O操作;同时为使服务端能高效处理接受的文件,采用了多线程的方案。

对JAVA的GUI编程不是很熟悉,这个项目中只写了个软件界面,但并没有实现监听接口,赋予任何功能。

其实对于这个项目,掌握WebSocket网络编程很重要,特别是 结合密码学做到的安全传输,包括字符串加密,文件加密等等,保障了机密性,完整性以及不可否认性。

环境搭建

JDK1.8 / Eclipse / Windows 10

关键代码及结果展示

  1. 先开启服务端(演示是本机,所以IP为127.0.0.1):
FileTransferServer server = new FileTransferServer(); // 启动服务端
server.load();

对于load:

public void load() throws Exception {
   
		while (true) {
   
			// server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
			Socket socket = this.accept();
			/**
			 * 我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求。
			 * 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可以把它改为如下这种异步处理与客户端通信的方式
			 */
			// 每接收到一个Socket就建立一个新的线程来处理它
			new Thread(new Task(socket)).start();
	}
}
  1. 打开客户端,建立连接
public FileTransferClient() throws Exception {
   
		super(SERVER_IP, SERVER_PORT);
		this.client = this;
		System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功连接服务端");
}

实现是多线程的,所以开启了三个客户端来发送文件:

// 启动客户端连接
FileTransferClient client1 = new FileTransferClient();
FileTransferClient client2 = new FileTransferClient();
FileTransferClient client3 = new FileTransferClient();
// 开始传输文件
client1.sendFile(packageDesCipher); // 加密的DES密钥
// 三个线程之间一定要暂停,不会改变B服务端接收文件的顺序,但是会改变B对文件名的判定。
// (因为线程是异步的,B的if还没判断完毕,下个线程就改变了变量)
Thread.sleep(3000);
client2.sendFile(packageSigA); // 签名
Thread.sleep(3000);
client3.sendFile(fileCipher); // 加密的文件

如图:
在这里插入图片描述
在这里插入图片描述

  1. A接收到B的公钥,B接收到A的公钥
System.out.println("【B】获得A的公钥为:" + FileTransferClient.mapA.get(0));
System.out.println("【A】获得B的公钥为:" + FileTransferServer.mapB.get(0));

在这里插入图片描述
在这里插入图片描述

  1. A生成DES对称密钥
String desKey = "923533706";
  1. A使用B的公钥对DES密钥进行加密
String desCipher = RSAUtil.encrypt(desKey, FileTransferServer.mapB.get(0));

在这里插入图片描述

  1. A指定待传输的文件
String filePath = "E:\\exp1\\tmpA\\mingwen.txt";

文件可以是任意类型,这里实例文本文件

  1. A用MD5对文件生成摘要A
String md5AClient = MD5Util.getFileMD5String(filePath);

在这里插入图片描述

  1. A用A的私钥对摘要A生成签名
String sigA = RSAUtil.sign(md5AClient, mapA.get(1));

在这里插入图片描述

  1. A用DES对称密钥对文件进行加密
String destFile = "E:\\exp1\\tmpA\\miwen.txt";
String fileCipher = DESUtil.encryptFile(desKey, file.getAbsolutePath(), destFile);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. A将加密后的DES密钥和签名写入文件
String packageDesCipher = "E:\\exp1\\tmpA\\PackDesCipher.txt";
FileWriter fwriter2 = new FileWriter(packageDesCipher);
fwriter2.write(desCipher);

String packageSigA = "E:\\exp1\\tmpA\\PackSigA.txt";
FileWriter fwriter1 = new FileWriter(packageSigA);
fwriter1.write(sigA);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. A发送文件
client1.sendFile(packageDesCipher); // 加密的DES密钥
client2.sendFile(packageSigA); // 签名
client3.sendFile(fileCipher); // 加密的文件
  1. B接收文件并存入本地
dis = new DataInputStream(socket.getInputStream());
//读取socket中的文件流,存入本地文件

在这里插入图片描述

  1. B使用B的私钥来解密DES密钥
desKeyB = RSAUtil.decrypt(tempDesKey, mapB.get(1));// 使用B的私钥解密
  1. B从文件中读取A的签名
sigA = bReader.readLine();// 因为签名只有一行,且为字符串
  1. B使用解密得到的DES密钥来解密文件
DESUtil.decryptFile(desKeyB, file.getAbsolutePath(), destFile);// 解密文件

在这里插入图片描述

  1. B读取解密的文件并用MD5生成摘要B
String md5BClient = MD5Util.getFileMD5String(destFile);

从上帝视角来说,摘要B与摘要A相同
在这里插入图片描述
在这里插入图片描述

  1. B验证签名是否匹配
    本该是 将解密的文件生成摘要,再同和 用RSA公钥解密签名生成的 摘要比较;(逆向解密思维
    将解密的文件生成摘要 和 读取的A的签名 和 A的公钥 验证是否匹配(正向加密思维
boolean check = RSAUtil.verify(md5BClient, sigA, FileTransferClient.mapA.get(0));

在这里插入图片描述

源码

MainFrame.java

package gui;

import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;



public class MainFrame extends JFrame{
   
	public static MainFrame instance = new MainFrame();
    
    private MainFrame(){
   
        this.setSize(1000, 710);
        this.setContentPane(MainPanel.instance);
        this.setLocationRelativeTo(null);// 窗口在屏幕中心
		//设置一个框体图标
		this.setIconImage(new ImageIcon(new File("C:\\Users\\szzs\\Pictures\\Camera Roll\\paidaxing.jpg").getAbsolutePath()).getImage());
		this.setTitle("Secure Transport by XiDieccc");
		//不可改变大小
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
    }
     
    public static void main(String[] args) {
   
        instance.setVisible(true);
    }
}

MainPanel.java

package gui;

import java.awt.Font;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;

import service.FileTransferServer;
import util.RSAUtil;

public class MainPanel extends JPanel {
   

	public static MainPanel instance = new MainPanel();
	// 启动服务端
	public JButton btnStartServer;
	// 启动客户端
	public JButton btnStartClient;
	// 选择文件
	public JButton btnFile;
	// 加密前的交换密钥
	public JTextPane textPaneServer;
	public JTextPane textPaneClient;
	// 加密后的文件信息
	public JTextPane textSrver;
	public JTextPane textClient;

	/**
	 * Create the panel.
	 */
	public MainPanel() {
   
		setLayout(null);

		JLabel lblNewLabel = new JLabel("Server");
		lblNewLabel.setVerticalAlignment(SwingConstants.TOP);
		lblNewLabel.setBounds(187, 13, 102, 38);
		lblNewLabel.setBackground(SystemColor.activeCaption);
		lblNewLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
		add(lblNewLabel);

		JLabel lblNewLabel_1 = new JLabel("Client");
		lblNewLabel_1.setFont(new Font("微软雅黑", Font.BOLD, 24));
		lblNewLabel_1.setBounds(703, 6, 83, 46);
		add(lblNewLabel_1);

		JSeparator separator = new JSeparator();
		separator.setOrientation(SwingConstants.VERTICAL);
		separator.setBounds(490, 0, 1, 700);
		add(separator);

		btnStartServer = new JButton("\u542F\u52A8\u670D\u52A1\u7AEF");
		btnStartServer.setForeground(SystemColor.textHighlight);
		btnStartServer.setBackground(SystemColor.activeCaption);
		btnStartServer.setFont(new Font("微软雅黑", Font.PLAIN, 15));
		btnStartServer.setBounds(14, 65, 113, 27);
		add(btnStartServer);

		btnStartClient = new JButton("\u53D1\u8D77\u8BF7\u6C42");
		btnStartClient.setForeground(SystemColor.textHighlight);
		btnStartClient.setFont(new Font("微软雅黑", Font.PLAIN, 15));
		btnStartClient.setBackground(SystemColor.activeCaption);
		btnStartClient.setBounds(514, 66, 113, 27);
		add(btnStartClient);

		// 选择文件按钮
		btnFile = new JButton("\u9009\u62E9\u6587\u4EF6");
		btnFile.setForeground(SystemColor.textHighlight);
		btnFile.setFont(new Font("微软雅黑", Font.PLAIN, 15));
		btnFile.setBackground(SystemColor.activeCaption);
		btnFile.setBounds(514, 277, 113, 27);
		add(btnFile);

		textPaneServer = new JTextPane();
		textPaneServer.setBackground(SystemColor.info);
		textPaneServer.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
		textPaneServer.setBounds(14, 390, 451, 270);
		add(textPaneServer);

		JLabel lblNewLabel_2 = new JLabel("\u6587\u4EF6\u63A5\u6536\u53CA\u89E3\u5BC6\u8BE6\u60C5\uFF1A");
		lblNewLabel_2.setForeground(SystemColor.textHighlight);
		lblNewLabel_2.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
		lblNewLabel_2.setBounds(14, 339, 153, 38);
		add(lblNewLabel_2);

		textPaneClient = new JTextPane();
		textPaneClient.setBackground(SystemColor.info);
		textPaneClient.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
		textPaneClient.setBounds(514, 390, 451, 270);
		add(textPaneClient);

		JLabel lblNewLabel_2_1 = new JLabel("\u6587\u4EF6\u4F20\u8F93\u53CA\u52A0\u5BC6\u8BE6\u60C5\uFF1A");
		lblNewLabel_2_1.setForeground(SystemColor.textHighlight);
		lblNewLabel_2_1.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
		lblNewLabel_2_1.setBounds(513, 339, 153, 38);
		add(lblNewLabel_2_1);

		textSrver = new JTextPane();
		textSrver.setBackground(SystemColor.info);
		textSrver.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
		textSrver.setBounds(14, 105
智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值