当前位置: 首页 > news >正文

[密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践


一、代码运行结果

在这里插入图片描述

二、国密算法与密钥协商背景

2.1 什么是国密算法?

国密算法是由中国国家密码管理局制定的商用密码标准,包括:

  • SM2:椭圆曲线公钥密码算法(非对称加密/签名/密钥协商)
  • SM3:密码杂凑算法(哈希)
  • SM4:分组密码算法(对称加密)

2.2 密钥协商的意义

在安全通信中,双方需要在不安全的信道上协商出相同的会话密钥,用于后续对称加密。SM2密钥协商协议解决了以下问题:

  • 避免预先共享密钥
  • 抵抗中间人攻击
  • 支持双向身份认证

三、SM2密钥协商原理详解

3.1 核心流程(基于ECMQV协议)

步骤角色A(发起方)角色B(响应方)
1生成临时密钥对 (rA, RA)生成临时密钥对 (rB, RB)
2发送RA给B发送RB给A
3使用双方公钥和临时公钥计算共享密钥使用双方公钥和临时公钥计算共享密钥

3.2 关键公式

共享密钥 = KDF( x_U \cdot (d_A + r_A \cdot s_A) \cdot (P_B + [s_B] \cdot R_B) )
  • x_U:椭圆曲线点坐标的x分量
  • d_A:A方私钥
  • r_A:A方临时私钥
  • s_A/s_B:静态公钥派生参数

四、Java实现环境准备

4.1 依赖配置

<!-- Bouncy Castle国密支持 -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.65</version>
</dependency>

4.2 初始化安全提供者

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;public class SM2KeyExchange {static {Security.addProvider(new BouncyCastleProvider()); // 添加BC提供者}
}

五、Java核心代码实现(含详细注释)

5.1 密钥对生成工具类

 /*** 生成SM2静态密钥对*/public static KeyPair generateStaticKeyPair() throws 

相关文章:

[密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践

一、代码运行结果 二、国密算法与密钥协商背景 2.1 什么是国密算法? 国密算法是由中国国家密码管理局制定的商用密码标准,包括: SM2:椭圆曲线公钥密码算法(非对称加密/签名/密钥协商)SM3:密码杂凑算法(哈希)SM4:分组密码算法(对称加密)2.2 密钥协商的意义 在安全…...

015--基于STM32F103ZET6的智能风扇设计

1.实物视频演示 智能风扇演示视频 2.程序代码讲解 STM32F103ZET6智能风扇_哔哩哔哩_bilibili 3源代码获取 https://download.csdn.net/download/weixin_41011452/90440545...

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

RBF神经网络+NSGAII多目标优化算法,工艺参数优化、工程设计优化(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RBF神经网络NSGAII多目标优化算法&#xff08;Matlab完整源码和数据&#xff09; 多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中&#xff0c;通常存在多个冲突的目标&#xff0c;即改善一…...

Zookeeper(79)如何进行Zookeeper的监控?

对 Zookeeper 进行监控是确保其高可用性和性能的关键步骤。监控 Zookeeper 通常包括以下几个方面&#xff1a; 健康检查&#xff1a;检查 Zookeeper 节点是否在线。性能指标&#xff1a;监控关键性能指标&#xff0c;如请求延迟、事务处理量等。日志监控&#xff1a;监控 Zook…...

运动想象 (MI) 分类学习系列 (17) : CCSM-FT

运动想象分类学习系列:用于运动图像 EEG 信号解码的跨通道特定互特征迁移学习 0. 引言1. 主要贡献2. 方法2.1 跨通道特定互特征迁移学习 (CCSM-FT) 网络2.2 功能转移:2.3 特征转移2.4 参数选择3. 结果4. 分析4.1 训练技巧分析4.2 特征转移分析5. 总结欢迎来稿论文地址:http…...

start DL from stratch (2)!!!

start DL from stratch &#xff08;2&#xff09;!!! 一、CPU and GPUcpuGPU安培架构爱达洛夫莱斯架构 二、使用conda创建一个新的虚拟环境三、autodl操作先知Linux复习目录文件和数据上传对于整个镜像的操作守护进程Tips 四、autodl租用创建实例<big>没有所需要的版本的…...

【深入浅出:Core-JS Legacy 的降级兼容指南】

深入浅出&#xff1a;Core-JS Legacy 的降级兼容指南 &#x1f6e0;️ &#x1f30d; 背景与核心概念 为什么需要 Polyfill&#xff1f; 随着 ECMAScript 标准的快速迭代&#xff08;ES6/ES2015&#xff09;&#xff0c;现代浏览器对新特性的支持存在碎片化问题。旧版浏览器&am…...

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…...

STM32之时钟树

左边是时钟产生电路&#xff0c;右边是时钟分配电路。中间的SYSCLK就是系统时钟72MHz&#xff0c;在产生电路有四个时钟源&#xff0c;分别是内部8MHz高速RC振荡器&#xff0c;外部的4-16MHz高速石英晶体振荡器&#xff0c;这个一般接8MHz,第三个是外部的32.768kHz低速晶振&…...

Unity插件-Mirror使用方法(一)Mirror介绍

目录 一、使用介绍 二、插件介绍 1、简述 2、核心功能与特点 基于组件的高层抽象 服务器-客户端架构 序列化与同步 可扩展性与灵活性 跨平台支持 社区与生态 3、典型应用场景 4、基本使用示例 安装 设置 NetworkManager 同步变量与 RPC 5、优缺点对比 6、为什…...

HVAC 设计:使用 Ansys Discovery 探索更好的设计

通过 Ansys Discovery 及其 2025 年新功能利用 CFD&#xff0c;通过 Computational Insights 应对 HVAC 行业的挑战。 挑战 HVAC 行业在设计高效可靠的管道系统方面面临多项挑战&#xff1a; 压力损失&#xff1a;设计不当的管道会增加能耗并降低热性能。复杂的几何形状&…...

ChatGPT 提示词框架

作为一个资深安卓开发工程师&#xff0c;我们在日常开发中经常会用到 ChatGPT 来提升开发效率&#xff0c;比如代码优化、bug 排查、生成单元测试等。 但要想真正发挥 ChatGPT 的潜力&#xff0c;我们需要掌握一些提示词&#xff08;Prompt&#xff09;的编写技巧&#xff0c;并…...

004-利用Docker安装Mysql

利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…...

Dify使用和入门

第一步&#xff1a;了解 Dify 在开始之前&#xff0c;先简单了解一下 Dify 是什么&#xff1a; Dify 是一个开源的 LLM 应用开发平台&#xff0c;专注于帮助开发者快速构建生产级的生成式 AI 应用。它支持知识库集成、RAG&#xff08;检索增强生成&#xff09;技术、复杂工作…...

高效管理 React 状态和交互:我的自定义 Hooks 实践

高效管理 React 状态和交互&#xff1a;自定义 Hooks 实践 在 React 中&#xff0c;Hooks 是一种使我们能够在函数组件中使用状态和副作用的强大工具。随着项目的增大&#xff0c;重复的逻辑可能会出现在多个组件中&#xff0c;这时使用自定义 Hooks 就非常合适。它们帮助我们…...

ESP 32控制无刷电机2

import machine import time import socket import network from machine import I2C, Pin, ADC def start_ap(): """ 启动ESP32的AP模式 """ ap network.WLAN(network.AP_IF) ap.active(True) ssid ESP32_APTest …...

揭开人工智能中 Tokens 的神秘面纱

揭开人工智能中 Tokens 的神秘面纱 在人工智能&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;"tokens" 是一个频繁出现且至关重要的概念。对于理解语言模型如何处理和理解人类语言&#xff0c;tokens 起着基础性的作用。那么&#xff…...

萌新学 Python 之 random 函数

random 模块&#xff1a;主要用来生成随机数 先导入包&#xff1a;import random randint(a, b)&#xff0c;生成 [a, b] 之间的整数&#xff0c;包含边界 a 和 b&#xff0c;a 和 b 为整数 random()&#xff0c;生成的是 [0,1) 之间的浮点数&#xff0c;包含 0 不包含 1 r…...

2-2linux系统IO

文章目录 linux系统文件io1 open /close1.1 open1.2 close1.3 示例1.3.1 打开已经存在的文件 2 read/write2.1 read2.2 write使用 遗留问题&#xff1a;新创建的文件权限很奇怪3 lseek3.1 文件指针的移动3.2 文件拓展 perror函数 linux系统文件io 系统函数是系统专有的函数&am…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...