SM2加解密、签名验签

article/2025/8/21 16:12:03

导论

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法。
国产SM2算法,是基于ECC的,但二者在签名验签、加密解密过程中或许有些许区别,目前鄙人还不太清楚,后期有机会的话会回来补充。

普通的软密钥,在签名验签、加密解密时,使用的0009规范;
如果是硬密钥,例如密码钥匙是0016规范(SKF),密码设备是0018规范(SDF);
在涉及一方签,另一方验时,需注意规范问题!!!

SM2基于椭圆曲线,公钥是曲线上的一点(x,y),即公钥由x和y分量组成。

ps:1024位的RSA算法,已经不安全了。

涉及标准文件

《GM_T 0003.1-2012SM2 椭圆曲线公钥密码算法第1部分:总则》
《GM_T 0003.2-2012SM2 椭圆曲线公钥密码算法第2部分:数字签名算法》
《GM_T 0003.3-2012SM2 椭圆曲线公钥密码算法第3部分:密钥交换协议》
《GM_T 0003.4-2012SM2 椭圆曲线公钥密码算法第4部分:公钥加密算法》
《GM_T 0003.5-2012SM2 椭圆曲线公钥密码算法第5部分:参数定义》
《GMT 0009-SM2 密码算法使用规范-报批稿》
《GMT 0016-智能密码钥匙密码应用接口规范》
《GMT 0018-密码设备应用接口规范》

ECC椭圆曲线

在这里插入图片描述
BC库实现了一种C1||C2||C3的ECC加密方式,密文格式:C1||C2||C3,C1是带有04的公钥格式
对于这种,明确一下每一段的长度就很有必要了:

  • C1: 公钥长度65字节,格式:04||x||y
  • C3: hash长度32字节
  • C2: 密文长度与明文长度一致

SM2

推荐的椭圆曲线、参数
椭圆曲线方程:y2 = x3 + ax + b
p= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b= 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
Gx= 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
Gy= BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

加密解密

参照SM2算法的第4部分:《GM_T 0003.4-2012SM2 椭圆曲线公钥密码算法第4部分:公钥加密算法》
涉及:《GM-T 0009》 9.2、9.3、7.2、7.4部分

截取了几份同一公钥加密的结果,发现x/y分量不一定是正好32字节(0x20),可能多一个补位,或者少一位。
补位原因:以x分量值举例,因为x的第一字节值大于128(0x80),所以需要在前面加上0x00。

如果有朋友要把asn1编码的加密值转为C1C3C2时,注意一下补位问题哈。
在这里插入图片描述

签名验签

SM2签名

涉及:《GM-T 0009》 9.4、9.5、7.3部分

按照国密的规范,SM2签名结果r||s长度应该是(r:32字节)+(s:32字节)64字节,就算加个04头字节,也是65个字节。
r:随机数
s:签名值

但是,我参考网上有限的资料发现sign1签名MEQCIC24h6tnaKcOnxNZe93rtLFrKEqM9R3yG8/Ba2+tyE+3AiBTG46yfxJziYDlaH1WZjrCfRloIuMnfx5oyEVuwgbV0A==长度为96字节,这一看就是base64加密数据,源签名长度96/4*3=72字节。

SM2签名结果长度为64字节,为什么出来的是72字节?我咨询过好几个过35114的博客主,回复都是,我们是硬加密。/(ㄒoㄒ)/~~

其实,SM2签名结果数据是要经过asn.1(der格式)编码的,编码结果长度在70-72变化。

ASN1将签名产生的 r 和 s 看作两个整数,若其第一个字节最高位为 1,则在整数前插入0x00。

ECC签名

密钥长度:
公钥0x41(65字节) 私钥0x20(32字节)

签名格式:TLV嵌套格式。
签名的主体分为R和S两部分。R(或S)的长度等于ECC私钥长度。R(或S)前的T为0x02,签名T为0x30。总体格式如下:
30 + LEN1 + 02 + LEN2 + 00 (optional) + r + 02 + LEN3 + 00(optional) + s
*当r或s的第1字节大于0x80时,需要在r或s前加1字节0x00。
LEN3为,0x00(optional) + s 的字节长度。
LEN2为,0x00(optional) + r 的字节长度。
LEN1为,LEN2+LEN3+4字节长度。
在这里插入图片描述

参考链接:https://blog.csdn.net/m0_71405746/article/details/128253831

ASN1编码后,格式如下:
00 30 44 02 20 … 02 20 …

附:一个经三未加密机ECC签名的印章结构,详看签名值,硬件签名签名值可能不够64字节,为凑长度首为补0,此时我们系统的软验签就过不了。解决方式:如果首位是0,就让硬件再签一次吧。

在这里插入图片描述

其中:
第1字节:若第一个字节最高位为 1,则在整数前插入0x00(有待验证)
第2字节:0x30表示一种通用的格式
第3字节:0x44表示后面跟了68个字节的数据
第4字节:0x02表示后面是一个整数
第5字节:0x20表示整数长度是32个字节

第38字节:0x02表示后面是个整数
第39字节:0x20表示整数长度是32个字节
第40字节:0x00表示签名值不足32位,首位补0了。

第40字节的0x00,即s的首位,就是软验证不过的问题所在吧。

SM2和ECC的区别

SM2基于ECC,却又不完全一样,有博主称:SM2与ecc的区别主要在于曲线参数的选择不同,另外在签名,验签的过程中也有一点区别,SM2的官方文档以及官方推荐参数可以参考
http://www.oscca.gov.cn/News/201012/News_1197.htm 。

《GM-T 0009》规范

相当于是《GM-T 0003》的补充用法。
在这里插入图片描述

密钥数据格式

私钥256位,公钥x/y分量各256位
注意:公钥内容为 04 || X || Y
公钥分量:x和y理论上是需要256位,即32字节。但实际上,也许是具体实现的误差,导致生成的公钥x、y分量不足32字节,发生补位情况,也会有33字节的情况。

公钥:理论是64字节(只含xy分量),也有可能是65字节(多个04、或者x多一字节、或y多一字节)
在这里插入图片描述

加解密

在这里插入图片描述

《GM-T 0009》 7.2部分的定义:加密数据格式
该规范要求输出的密文符合asn1标准,其中:
c1: x/y分量
c3: hash
c2:cipherText

c1/c2/c3这种叫法是《GMT 0003.4》定义的

在这里插入图片描述
注意:这里的xy分量是Integer类型,据说在ASN1编码规范中,对于Integer类型的数,有一个规则:如果数字的最高位是1,则需要再前面补充一个全0的八位组。
在这里插入图片描述

《GM-T 0009》 7.4部分的定义:密钥对保护数据格式(数字信封?)
在这里插入图片描述

签名验签

在这里插入图片描述

《GM-T 0009》 7.3部分的定义:签名数据格式
在这里插入图片描述

《GMT 0003.4》

加解密

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

在这里插入图片描述

小剧场

java世界里,如何判断一个字节最高位是否是1?

十进制:128
二进制:1000 0000
十六进制:0x80
在这里插入图片描述
由于1000 0000值的特殊性,除了最高位是1,其余位全是0,任何值与其做【与】操作,低位都会被抵消为0。

举例:( x & 0x80)

  • 结果等于0x80,则表示x最高位为1,即大于等于128;
  • 不等于0x80,则x最高位为0,即小于128;

http://chatgpt.dhexx.cn/article/GkPSbFIx.shtml

相关文章

sm2和sm4加密算法浅析

sm2和sm4加密算法浅析 一: SM2 简介:SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 ,SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位&#xff0…

国密算法(SM2)简介及SM2生成秘钥

国密算法(SM2)生成秘钥 一、国密算法介绍二、SM2算法和RSA算法比较三、生成SM2秘钥1、openssl生成SM2秘钥1.1、安装openssl1.2、生成SM2私钥1.3、生成SM2公钥 2、nodejs:使用sm-crypto包生成SM2秘钥3、c生成秘钥 参考 一、国密算法介绍 国密即国家密码局…

向量积(叉积)

a和b叉积可表示为ab,结果是一个和这两个向量都垂直的伪向量 ab absinθ*n ,ab为两向量的模长,θ是两向量的夹角,n是垂直二者的单位向量。 叉积的长度可以理解为以ab为邻边的平行四边形面积 叉积的运算 反交换律 ab-ba 分配律…

向量的点乘(内积)和叉乘(外积)

向量点乘:a * b(常被写为a b) 点乘,也叫向量的内积、数量积.顾名思义,求下来的结果是一个数. 向量a向量b|a||b|cos 在物理学中,已知力与位移求功,实际上就是求向量F与向量s的内积,即要用点乘. 向量叉乘:a ∧ b(常被…

向量的内积(点乘)与外积(叉乘)

向量的内积(点乘)与外积(叉乘) 向量的内积点乘 向量的外积叉乘 向量的内积(点乘) 内积的几何意义: 用来表征或计算两个向量之间的夹角在b向量在a向量方向上的投影。 向量的外积(叉…

两向量的向量积

两向量的向量积 两向量 a 与 b 的向量积(外积)是一个向量,记做 a b \mathbf{a}\times \mathbf{b} ab 或 [ a b ] [\mathbf{a}\mathbf{b}] [ab],它的模是 ∣ a b ∣ ∣ a ∣ ∣ b ∣ sin ⁡ ∠ ( a , b ) |\mathbf{a}\times…

8.2 向量数量积与向量积(点乘与叉乘)

本篇内容依然是向量的运算,只不过不属于线性运算,内容包括向量的数量积与向量积。 一、向量的数量积(内积、点乘,参与运算的是向量,结果是数) (一)问题产生的背景与表达 &#x…

【口诀】巧记泰勒公式

函数 多项式函数 可以计算出精确值 非多项式函数 无法计算出精确值 泰勒公式的本质 多项式函数逼近非多项式函数 随着项数累加,逼近的误差就会越小 规律: 只需要确定x的指数符号只有两种情况 要么符号相同(全为) 要么符号交替( -)开头要么1&am…

matlab泰勒公式含义,泰勒公式的哲学意义与敏捷研发

学过微积分的人都知道泰勒展开公式,它是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方法,用标准的数学术语来描述是这样的:若函数f(x)在包含x0的某个闭区间[a,b]上具有n阶导数,且在开区间(a,b)上具有(n 1)阶导数,则对闭区间[a,b]上任意一点…

泰勒公式及泰勒级数

目录 一、背景二、提出问题三、解决问题四、应用——泰勒级数※ 函数的幂级数展开 参考文献 一、背景 对于一些复杂的函数,通常会找简单的函数做近似,而多项式函数就是常用的一种简单函数。 比如当 ∣ x ∣ |x| ∣x∣ 很小时,有以下近似&a…

泰勒公式求极限(如何用+精度怎么确定)一文扫除泰勒公式难点

有些复杂的极限题,里面会涵盖着各种各样的函数,这些群魔乱舞的函数加大了我们计算极限的难度,此时想:如果可以将这些函数统一成一样的形式该多好?此时,就有我们的泰勒公式了。 1.泰勒公式怎么用: 指数函…

泰勒公式记忆方法

泰勒公式记忆方法 几个常见函数的泰勒公式 f ( x ) f ( x 0 ) f ′ ( x 0 ) ( x − x ) f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 ⋯ f ( n ) ( x 0 ) n ! ( x − x 0 ) n R n ( x ) f ( x ) f ( 0 ) f ′ ( 0 ) x f ′ ′ ( 0 ) 2 ! x 2 ⋯ f ( n ) ( 0 ) n ! x n o (…

理解高斯分布

开始前,先看几个重要概念: 概率函数:把事件概率表示成关于事件变量的函数 概率分布函数:一个随机变量ξ取值小于某一数值x的概率,这概率是x的函数,称这种函数为随机变量ξ的分布函数,简称分布…

透彻理解高斯分布

https://www.toutiao.com/a6639894224189784590/ 2018-12-28 12:22:15 正态分布是与中的定量现象的一个方便模型。各种各样的心理学测试分数和现象比如计数都被发现近似地服从正态分布。 开始前,先看几个重要概念: 概率函数:把事件概率表示成…

高斯分布的一些理解

转自:http://blog.csdn.net/rns521/article/details/6953591 正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计…

高斯分布拟合

题目: 产生N个服从高斯分布的随机数,计算这些随机数的均值和方差,并与高斯分布的均值和方差比较,N100,1000,10000,100000 import matplotlib.pyplot as plt import scipy.stats as sta import numpy as npmu_True 5 #设置高斯…

高斯分布~

为什么MLE估计服从高斯分布的数据分布方差会估小? 因为MLE求方差是根据数据的均值,并不是分布的期望,因为会根据采样的偏差将均值拉到符合数据的地方,从而算出来的方差会变小。 从几何层面看高维高斯分布 主要看exp上的值&…

机器学习中的高斯分布

高斯分布与数据预处理:数据分布转换高斯分布与聚类:GMM高斯分布与异常检测高斯分布与马氏距离 高斯分布与数据预处理:数据分布转换 当我们上手一个数据集时,往往第一件事就是了解每个特征是如何分布的。特征分布指的就是某个特征在…

融合高斯分布

(一)数据融合 假设两个传感器的测量结果分别为和,对应的标准差分别为和。 如何根据这两组数据得到最优估计? 估计值取为两个传感器测量结果的线性组合,如下所示: 为了获得最优估计值,需要让估…

java高斯分布_高斯分布的生成

1. 如何生成高斯分布? 在java8中的实现采用了 Marsaglia polar method (Box–Muller的一种形式), 具体理论如下: 随机变量 服从 的均匀分布 计算 如果 , 接着计算, 否则转4 , </