现代密码学-国密算法

商用密码算法种类

商用密码算法 

密码学概念、协议与算法之间的依赖关系

数字签名、证书-公钥密码、散列类算法

消息验证码-对称密码 ,散列类

安全目标与算法之间的关系

机密性--对称密码、公钥密码

完整性--散列类算法

可用性--散列类、公钥密码

真实性--公钥密码

不可否认--公钥密码

SM2椭圆曲线公钥加密

公钥密码体制

公钥体制加密

  1. 接收者B产生一对密钥:私钥--SK_{_{B}},公钥--PK_{_{B}}
  2. A想向B发消息m,则使用B的公钥加密m,表示为c=\varepsilon _{PK_{B}}[m], c是加密后的密文,\varepsilon是加密算法
  3. B收到密文c后,用自己的私钥SK_{_{B}}解密,表示为m=D_{SK_{B}}[c],D是解密算法

只能由B进行解密

公钥体制认证

用户A用自己的私钥对m进行加密,c=\varepsilon _{SK_{A}}[m],将c发给B,B用A的公钥解密m=D_{PK_{A}}[c]

 从m得到c的过程是经过A的私钥加密的,只能A才能做到,因此c可以当作A对m的数字签名。

双重加密、解密

为了同时具有保密功能和认证功能,可以使用双重加、解密

发送方先用自己的私钥对消息加密,用于提供数字签名。再用接收方的公钥加密,表示为

 c=\varepsilon _{PK_{B}}[\varepsilon _{SK_{A}}[m]]

接收者收到后,x先用自己的私钥,再用发送方的公钥进行两次解密,解密过程为

m=D_{PK_{A}}[D_{SK_{B}}[c]]

椭圆曲线密码体制

椭圆曲线密码 Elliptic CurveCryptography ECC:利用椭圆曲线实现密码技术

椭圆曲线上的离散对数问题

本质:已知xG求数x的问题

椭圆曲线密码中,先确定一条椭圆曲线,然后对椭圆曲线上的某一些点之间的“运算”进行定义,利用这些“运算”来进行密码技术相关的计算。

已知

        椭圆曲线E

        椭圆曲线E上的一点G(基点)

        椭圆曲线上的一点xG(G的x倍)

求解

        数x

椭圆曲线Diffie-Hellman密钥交换

AB需要共享一个对称密码的密钥,用椭圆曲线Diffie-Hellman密钥交换,生成共享密钥

  • A向B发送点G。G被窃听无影响
  • A生成随机数a,将a作为A的私钥
  • B生成随机数b,将b最为B的私钥
  • A向B发送点aG
  • B向A发送bG
  • A对收到的bG计算其在椭圆曲线上a倍的点,a(bG)=abG==共享密钥
  • B对收到的aG计算其在椭圆曲线上b倍的点,b(aG)=baG=abG==共享密钥

每次通信使用不同的随机数,共享密钥也会随之改变==保证了前向安全性forward secrecy

SM2

SM2是国家密码管理局颁布的中国商用公钥密码标准算法,是一组椭圆曲线密码算法,包含加解密算法、数字签名算法。

SM2与国际ECC比较

        ECC算法采用国际机构建议的曲线和参数,SM2算法的参数需要利用一定的算法产生,算法中加入了用户特异性的曲线参数、基点、用户的公钥点信息,安全性更高

        ECC中,用户可以选择MD5或SHA-1等国际通用的哈希算法,SM2使用SM3哈希算法,SM3哈希算法输出为256比特,与SHA-256算法安全性相当

SM2椭圆曲线公钥密码加密算法

基本参数

基于素数域F_{p}的SM2算法参数如下:

F_{p}的特征p为m比特长的素数,p要尽可能大;

长度不小于192比特的比特串SEED;

F_{p}上的2个元素a,b,满足4{a^{3}}+27{b^2}\neq 0,定义曲线E(F_{p}):y^2=x^2+ax+b

基点G=(x_G,y_G)\in E(F_p),G\neq 0;

G的阶n为m比特长的素数,满足n> 2^191 and n> 4\sqrt{p};

h=\frac{\left | E(F_p) \right |}{n}余因子,其中 |E(F_p)|是曲线E(F_p)的点数。

SEED,a,b产生的算法:

  1. 任意选取长度不小于192比特的比特串SEED;
  2. 计算H=H_{256}(SEED),记H=(h_{255},h_{254},...,h_0),其中H_{256}表示256比特输出的SM3哈希算法
  3. R=\sum_{255}^{0}h_i2^i;
  4. r=R mod p
  5. F_{p}上任意选择2个元素a,b,满足 rb^2=a^3 mod p;
  6. 若 4{a^{3}}+27{b^2}= 0 mod p,则返回1;
  7. 所选择的F_{p}上的曲线是E(F_{p}):y^2=x^2+ax+b
  8. 输出(SEED,a,b)

密钥产生

假设接收方为B,B的秘密钥取{1,2,...,n-1}中的一个随机数d_B,记为d_B\leftarrow\left \{ 1,2,...,n-1 \right \}_R,其中G的阶n

B的公开钥取为椭圆曲线上的点:P_B=d_BG,其中,G=G(x,y)是基点

加密算法

假设发送方是A,A要发送的消息表示为M比特串,M的长度为klen.算法如下:

  1. 选择随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
  2. 计算椭圆曲线点C_1=kG=(x_1,y_1)),将x1,y1表示为比特串;
  3. 计算椭圆曲线点S=HP_B,若S为无穷远点,则报错退出;
  4. 计算椭圆曲线kP_B=(x_2,y_2),将x2,y2表示为比特串;
  5. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则返回1;
  6. 计算C_2=M\oplus t----(mod 2 加法)
  7. 计算C_3=Hash(x_2 || M || y_2)
  8. 输出密文C=(C1,C2,C3)

KDF(*)是密钥派生函数,本质为一个伪随机数产生函数,用来产生密钥,这里KDF为SM3,第(3)步的H也是SM3

解密算法

B收到密文C后,进行解密,过程如下:

  1. 从C中取出C1,将C1表示为椭圆曲线上的点,验证C1是否满足椭圆曲线方程。不满足就报错退出;
  2. 计算椭圆曲线点S=HC1,若S为无穷远点,则报错退出;
  3. 计算d_BC_1=(x_2,y_2),将x2,y2表示为比特串;
  4. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则报错退出;
  5. 从C中取出C2,计算{M}'=C_2\oplus t;
  6. 计算u=Hash(x_2 || {M}' || y_2),从C中取出C3,若u \neq C_3则报错退出;
  7. 输出明文{M}'

SM2椭圆曲线公钥密码签名算法

基本参数

与前面加密算法的参数设置相同

密钥产生

与与前面加密算法产生方法一样,记为d_A,P_A=(x_A,y_A)

ID_A是A的长度为entlen_A比特的标识,ENTL_Aentlen_A转换而成的两个字节,A计算Z_A=H_{256}(ENTL_A || ID_A || a||b||x_G||y_G||x_A||y_A),其中a,b是椭圆曲线方程的参数,x_G,y_G是基点G的坐标,x_A,y_AP_A的坐标。将这些值转换为比特串后,在进行H_{256}。验证方B验证签名时,也需要计算Z_A

签名算法

设待签名的消息为M,操作如下:

  1. \tilde{M}=Z_A || M
  2. 计算e=H_v(\tilde{M}),将e转换为整数,Hv是输出为v比特长的哈希函数
  3. 用随机数产生器生成随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
  4. 计算椭圆曲线点C_1=kG=(x_1,y_1))
  5. 计算r=(r+x_1) mod n,若r=0或者r+k=n,则返回3
  6. 计算s=((1+d_A)^{-1})\cdot (k-r\cdot d_A))mod n,若s=0,则返回3
  7. 消息M的签名为(r,s)

验证算法

B收到消息{M}'以及其签名({r}',{s}'),进行验证操作:

检验{r}'\in [1,n-1]是否成立,若不成立,验证失败;

检验{s}'\in [1,n-1]是否成立,若不成立,验证失败;

{\tilde{M}}'=Z_A || {M}'

计算{e}'=H_v({\tilde{M}}'),并将其转换为整数;

计算t=({r}'+{s}')mod n,若t=0,验证失败

计算椭圆曲线点({x}',{y}')={s}'G+tP_A

计算R=({e}'+{x_1}')mod n,检查R={r}'是否成立,若成立则验证通过,否则,验证失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目雅景临居---模块2 标签管理

一、 [根据类型]查询标签列表 Autowiredprivate LabelInfoService service;Operation(summary "&#xff08;根据类型&#xff09;查询标签列表")GetMapping("list")public Result<List<LabelInfo>> labelList(RequestParam(required false)…

Linux学习笔记6 进程角度看内存泄露

一&#xff0c;从进程角度看堆区内存申请与释放问题 1&#xff0c;c语言中的内存泄漏 内存溢出&#xff1a;申请内存时&#xff0c;没用足够的内存可以使用。 内存泄露&#xff1a;严格来说&#xff0c;只有对象不会再被程序用到了&#xff0c;但是GC又不能回收它们的情况&…

ue项目更改项目缓存 防止跑ue项目c盘占用过多内存

原本项目缓存 在ue引擎所在的文件夹里找好baseEnging.ini 搜索install 找到第7个install 更改缓存路径到指定位置

【Text2SQL 论文】QDecomp:探索 CoT-style 的 prompt 来解决 Text2SQL

论文&#xff1a;Exploring Chain of Thought Style Prompting for Text-to-SQL ⭐⭐⭐⭐ EMNLP 2023, arXiv:2305.14215 一、论文速读 本文通过对 LLM 使用 CoT-style 的 prompting 方法来解决 Text2SQL 问题&#xff0c;试图回答下面两个问题&#xff1a; 哪种 prompting s…

性能工具之 JMeter 常用组件介绍(二)

文章目录 一、Thread Group二、断言组件1、Response Assertion&#xff1a;响应断言2、Response Assertion&#xff1a;响应断言3、Duration Assertion&#xff1a;响应时间断言4.、JSON Assertion&#xff1a;json断言 一、Thread Group 线程组也叫用户组&#xff0c;是性能测…

通过血清拉曼光谱进行COVID-19的高效初步筛查

通过血清拉曼光谱进行COVID-19的高效初步筛查 原创 小王搬运工 时序课堂 2024-06-04 20:04 四川 论文地址&#xff1a;https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/full/10.1002/jrs.6080 论文源码&#xff1a;无 期刊&#xff1a;JOURNAL OF RAMAN SPE…

LangChain学习之 Question And Answer的操作

1. 学习背景 在LangChain for LLM应用程序开发中课程中&#xff0c;学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能&#xff0c;遂做整理为后面的应用做准备。视频地址&#xff1a;基于LangChain的大语言模型应用开发构建和评估。 2. Q&A的作用 …

Echarts 中type是value的X轴在设置了interval间隔后没有展示

文章目录 问题分析问题 Echarts中type是value的X轴在设置了interval间隔后没有展示 分析 之前代码是这样写的:axisLabel 属性中设置了 interval ,但未起作用,原因如下 在 ECharts 中,interval 属性是用于类目型(category)轴的刻度间隔设置,并不适用于数值型(value)…

解决 clickhouse jdbc 偶现 failed to respond 问题

背景 Clickhouse集群版本为 Github Clickhouse 22.3.5.5&#xff0c; clickhouse-jdbc 版本为 0.2.4。 问题表现 随着业务需求的扩展&#xff0c;基于Clickhouse 需要支持更多任务在期望的时效内完成&#xff0c;于是将业务系统和Clickhouse交互的部分都提交给可动态调整核心…

windows上安装MongoDB,springboot整合MongoDB

上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB&#xff0c;并通过在springboot项目中使用MongoDB记录用户…

Go语言交叉编译

Golang 支持交叉编译&#xff0c; 在一个平台上生成然后再另外一个平台去执行。 以下面代码为例 build ├── main.go ├── go.mod main.go内容 package mainimport "fmt"func main() {fmt.Println("hello world") }windows系统上操作 1.cmd窗口编译…

java新特性--03-1--Stream---Collectors工具类

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.stream 收集Collectors工具类注意区分 Collections工具类 练习1&#xff1a;查找工资大于6000的员工&#xff0c;结果返回为一个List练习2&#xff1a;查找年龄小…

【设计模式】结构型-组合模式

前言 在软件开发中&#xff0c;设计模式是一种被广泛应用的解决问题的方法论。其中&#xff0c;结构性设计模式是一类特别重要的模式&#xff0c;它们用于处理类或对象之间的组合关系&#xff0c;其中之一就是组合模式。组合模式允许客户端统一对待单个对象和对象的组合&#…

【前端技术】 ES6 介绍及常用语法说明

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

使用wheelnav.js构建酷炫的动态导航菜单

目录 前言 一、WheelNav是什么 1、项目地址 2、关于开源协议 3、相关目录介绍 二、如何使用wheelnav.js 1、新建html页面 2、设置style样式 3、创建展示元素实现动态导航 三、参数即方法介绍 1、参数列表 2、运行方法 3、实际成果 四、总结 前言 用户体验永远是一…

玩转盲盒潮流:从0到1搭建小程序平台

玩转盲盒潮流并搭建一个从0到1的小程序平台来创作内容是一个充满挑战但有趣的过程。以下是一个步骤指南&#xff0c;帮助你实现这一目标&#xff1a; 1. 市场调研与定位 了解盲盒市场&#xff1a;研究当前盲盒市场的趋势、消费者喜好和成功案例。确定目标用户&#xff1a;明确…

软件质量保障——三、四

三、黑盒测试 1.黑盒测试概述 1.1 如何理解黑盒测试&#xff1f; 1.2 黑盒测试有什么特点&#xff1f; 1.3 如何实施黑盒测试&#xff1f; 2. 黑盒测试用例设计和生成方法&#xff08;这里还是要自己找题做&#xff09; 2.1 等价类划分法 步骤&#xff1a; 1.选择划分准…

BI平台概述

随着数字化浪潮的推进&#xff0c;企业对于数据驱动决策的需求日益增长。纷享销客作为一款领先的CRM平台&#xff0c;一直致力于帮助企业实现销售管理的高效与智能。纷享销客一体化BI智能分析平台作为CRM平台中的重要一环&#xff0c;旨在为企业提供更加全面、深入的数据分析能…

HBuilderX编写APP一、获取token

一、新建项目 二、从onenet获取key.js 1、下载之后的压缩包&#xff0c;解压2、关键就是找到key.js 3、将这个key.js复制到刚才的目录下面去 4、这个key.js文件就是生成token的代码 5、只要调用createCommonToken(params)这个函数&#xff0c;就可以实现生成token了 其中onload…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…