SM2签名与验证过程

news/2024/6/3 15:19:36 标签: 密码学

1. SM2基本介绍

SM2算法定义了两条椭圆曲线,一条基于F§上的素域曲线,一条基于F(2^m)上的拓域曲线,目前使用最多的曲线为素域曲线,本文介绍的算法基于素域曲线上的运算,素域曲线方程定义如下:
y 2 − x 3 + a x + b y^2-x^3+ax+b y2x3+ax+b
SM2算法定义了5个默认参数,即有限域F§的规模p,椭圆曲线参数a,b,椭圆曲线的基点G(x,y),与G的阶n。

国密算法标准中给出了对应的默认值,默认值如下:

p:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
n:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
a:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b:28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
Gx:32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
Gy:BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

牢记上面参数,在后续的运算过程中会使用到上面参数。

2. SM2签名与验证的参数

在SM2签名的过程除与RSA算法中私钥参与外,SM2签名还新增了公钥与用户标识(IDa),私钥我们标记为 D,公钥Pub(x,y)。

3.SM2签名过程

我们假设待签名消息为M,我们要先对消息进行预处理,处理过程如下:

Za = HASH256(ENTL||IDa||a||b||Gx||Gy||Pubx||Puby)

ENTL是用户标识(IDa)的长度,占两个字节的长度。

A1: M' = Za || M

A2: e = Hash(M'),将e转换成一个大整数

A3:产生随机数 k , k的范围在 [1, n-1]上

A4:计算点(x1,y1) = kG,将x1转换为一个大整数

A5:计算 r = (e + x1) mod n , 若 r = 0 或 r + k = n 返回A3重新选择随机数

A6:计算 s = ((1 + D)^-1 · (k - r · D)) mod n , 若 s = 0 返回A3重新选择随机数

A7:将 r 与 s 转换成大整数,r 与 s 共同组成了签名结果

4. SM2 签名验证

假设我们收到的消息原文为 M,签名值为(r,s),对于该签名的验证流程如下:

B1: r 的范围是否在 [1, n-1] 中,如不在,验证失败

B2: s 的范围是否在 [1, n-1] 中,如不在,验证失败

B3:M' = Za || M

B4:e = Hash(M'),将e转换成一个大整数

B5:计算 t = (r + s) mod n ,若 t = 0,验证失败

B6:计算点(x1,y1)= [s]G + [t]Pub(x,y)

B7: 计算 R = (e + x1) mod n,检验 R = r,若不相等,验证失败


http://www.niftyadmin.cn/n/470385.html

相关文章

【DCT变换】Python矩阵运算实现DCT变换

一、前言 DCT变换(离散余弦变换) 是数字图像处理过程中广泛采用的一种操作,用于将空域的图像转换为频域表示,从而能够更有效地进行压缩、滤波和特征提取等处理。它在许多应用领域中发挥着重要的作用,尤其在图像和视频…

go语言系列基础教程总结(2)

1、定义定长数组 var myArray [10]int{1,2,3,4,5} 2、定义动态数组 var arr [ ] int arr make([ ]int,6) 3、定义map var m map[string]string m make(map[string]string,10){ "one": "java", "two": "c#", } 3、定…

基于SpringBoot的在线拍卖系统【附ppt和万字文档(Lun文)和搭建文档】

主要功能 主要功能 前台登录: ①首页:轮播图、竞拍公告、拍卖商品展示 ②拍卖商品:分类:手机、数码、电器等,可以点击商品竞拍 ③竞拍公告:可以查看竞拍的信息 ④留言反馈:用户可以提交留言 ⑤…

web前端day01

授课老师 :陶国荣 联系方式 : taogrtedu.cn 授课阶段 : Web前端基础 授课内容 : HTML CSS JavaScript 文章目录 一、Web前端介绍1. 什么是网页2. 网页的组成3. 网页的优势4. 开发前的准备 二、 HTML语法介绍1. HTML介绍2. 标…

(面试题)消息队列如何处理消息积压呢?

目录 一、提前预防,通过优化性能的方式,来避免出现消息积压1. 发送端性能优化(1)那要如何解决业务逻辑执行耗时过长这件事呢?(2)发送消息过程中需要考虑哪些步骤的耗时?(…

2023-06-26 mysql-嵌套循环连接-执行分析

摘要: 对mysql5.7的嵌套循环连接的执行做分析, 从执行计划和执行流程的不同角度分析块嵌套循环连接的执行细节. 上下文: 2023-06-25 mysql-包含内连接的嵌套外连接-JOIN_condition_to_WHERE-分析_财阀悟世的博客-CSDN博客 2023-06-25 mysql-嵌套循环优化-块嵌套循环算法-分…

SpringBoot实战案例:图书管理系统

SpringBoot实战案例:图书管理系统 在本文中,我们将介绍如何使用SpringBoot框架构建一个简单的图书管理系统。我们将从零开始,逐步完成系统的搭建。本文将分为以下七个部分: 系统需求分析搭建项目框架实现数据访问层实现业务逻辑…

变量命名有哪些规则?

变量命名是任何编程语言的重要部分,正确的变量命名可以帮助提高代码的可读性和可维护性。以下是一些常见的变量命名规则: 唯一性:每个变量都应该有一个唯一的名字,以区别于其他变量。语义性:变量名应当能够清晰地反映…