SM国密算法(三)-- SM2算法
目录
- 一、简介
- 二、数学公式
- 获取公私钥:
- 密钥对的生成:
- SM签名
- SM验签
- SM加密
- SM解密
- 加解密中C1,C2,C3
一、简介
SM2非对称加密算法。由国家密码管理局于2010年12月17日发布。基于椭圆曲线密码的公钥密码算法标准,其密钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。
SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。随着密码技术和计算技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。SM2算法在安全性、性能上都具有优势。
二、数学公式
获取公私钥:
椭圆曲线方程:
y^2 = x^3 + ax + b mod p
- 确认a、b、p,确认曲线。
- 选择一个点 P ( x g , y g ) P(x_g, y_g) P(xg,yg)为 基 点 。
- 对曲线做切线、x对称点运行。次数为d,运算倍点为Q
- d为私钥,Q为公钥
密钥对的生成:
- 产生随机整数 d [ 1 , n − 2 ] d[1,n−2] d[1,n−2]
- G为基点,计算点 P = ( x P , y P ) = [ d ] G P = (xP, yP) = [d]G P=(xP,yP)=[d]G;
- 密钥对为: ( d , P ) (d,P) (d,P) 其中,d为私钥,P为公钥
一个很典型的例子:
a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
x_g = 0x32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
y_g = 0xbc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0
n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
SM签名
M为待签名消息,数字签名结果为 ( r , s ) (r,s) (r,s) ,用户密钥对 ( d , P ) (d,P) (d,P)。
实现步骤:
- e = h a s h ( M ) e = hash(M) e=hash(M) => 获取消息散列值
- 产生随机数k => 以便即使是同一个消息,每次签名出来的结果不同。
- 使用随机数,计算椭圆曲线点 ( x 1 , y 1 ) = [ k ] G (x_1, y_1) = [k]G (x1,y1)=[k]G
- r = ( e + x 1 ) m o d n r = (e + x1) mod n r=(e+x1)modn => 判断: r = 0 r = 0 r=0 或者 r + k = n r + k = n r+k=n, 继续第2步。
- s = ( ( 1 + d ) − 1 ∗ ( k − r ∗ d ) ) m o d n s = ((1 + d)^{-1} ∗ (k − r ∗ d )) mod n s=((1+d)−1∗(k−r∗d))modn, 若 s = 0,继续第2步
- r,s 为签名信息。
SM验签
M为明文, ( r , s ) (r, s) (r,s) 为签名结果,用户公钥P
实现步骤:
- e = h a s h ( M ) e=hash(M) e=hash(M)
- t = ( r + s ) m o d n t = (r+s)\ mod\ n t=(r+s) mod n
- ( x , y ) = [ s ] G + [ t ] P (x,y)=[s]G + [t]P (x,y)=[s]G+[t]P
- R = ( e + x ) m o d n R=(e+x)\ mod\ n R=(e+x) mod n
- 计算R是否等于r
[ s ] G + [ t ] P [s]G + [t]P [s]G+[t]P 的结果可以推导出等于 [ k ] G [k]G [k]G
验证原理
[s]G + [t]P = sG + (r + s)P= sG + (r + s)dG = sG + sdG + rdG = (1 + d)sG + rdG= (1 + d)(1 + d)^{-1} * (k − rd)G + rdG = (k − rd)G + rdG= kG − rdG + rdG= kG = (x1, y1)
SM加密
M为明文字符串
- 获取随机数k
- (x1,y1) = [k]G
- S = [h]P => h 为余因子
- C 1 = ( x 2 , y 2 ) = [ k ] P C1=(x2,y2)= [k]P C1=(x2,y2)=[k]P
- t = K D F ( x 2 ∣ ∣ y 2 , k l e n ) t = KDF( x2 || y2 , klen) t=KDF(x2∣∣y2,klen) => klen为M的长度。KDF是sm2的密钥派生函数
- C 2 = M + t C2 = M + t C2=M+t
- C 3 = H a s h ( x 2 ∥ M ∥ y 2 ) C3 = Hash( x2 ∥ M ∥ y 2 ) C3=Hash(x2∥M∥y2)
- C = C 1 ∥ C 2 ∥ C 3 C = C 1 ∥ C 2 ∥ C 3 C=C1∥C2∥C3
SM解密
C为密文字符串,klen为密文中C2的长度
- C 1 = C C1 = C C1=C 里面获取,验证C1是否满足椭圆曲线。 ⇒ C2长度确定,可以获取C1内容。
- S = [ h ] C 1 S = [h]C1 S=[h]C1, S为无穷点,退出。
- ( x 2 , y 2 ) = [ d ] C 1 (x2, y2) = [d]C1 (x2,y2)=[d]C1
- t = K D F ( m 2 ∣ ∣ y 2 , k l e n ) t = KDF(m2 || y2, klen) t=KDF(m2∣∣y2,klen)
- M = C 2 + t M^~ = C2 + t M =C2+t
- u = H a s h ( x 2 ∣ ∣ M ∣ ∣ y 2 ) , u ? = = C 3 u = Hash(x2 || M^~ || y2), u? == C3 u=Hash(x2∣∣M ∣∣y2),u?==C3
- M M^~ M 为明文
加解密中C1,C2,C3
SM2非对称加密的结果由C1,C2,C3三部分组成。
其中C1是生成随机数的计算出的椭圆曲线点,C2是密文数据,C3是SM3的摘要值。
最开始的国密标准的结果是按C1C2C3顺序的,新标准的是按C1C3C2顺序存放的
SM国密算法(三)-- SM2算法相关推荐
- python商用_python实现sm2和sm4国密(国家商用密码)算法的示例
GMSSL模块介绍 GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法.项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用. 安 ...
- SM2 (国密的一种算法)
SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法. 中文名 SM2 发布时间 2010年12月17日 发布单位 国家密码管理局 性 质 椭圆曲线公钥密码算法 目录 1 简 ...
- 数据结构与算法(三) 排序算法(代码示例)
数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...
- 国密SM1、SM2、SM3、SM4算法资料大全
SM2国密算法证书解析: http://blog.csdn.net/yyfzy/article/details/46798965 http://blog.csdn.net/sunboy2718/art ...
- 国密局公开SM2和SM3算法或预示中国商密算法将走向开放
临近2010年年底的时候,在国密局的网站上公布了基于椭圆曲线ECC的SM2公开密钥国密算法和SM3杂凑算法.加上原来的SM1商密对称算法,中国定义的算法终于开始成熟并且以一个大方的姿态展示出来了. 此 ...
- 国密学习笔记 对称密码算法
对称密码的特征是加密密钥和解密密钥完全相同或者一个密钥很容易从另一个密钥中导出. 对称密码有两种主要形式: 序列密码(也叫流密码,stream cipher),国密标准中的ZUC祖冲之算法 ZUC在生 ...
- sm3算法实现java_[转]国密SM3杂凑算法与实现
国密办已于去年公布国产商密算法SM3,http://www.oscca.gov.cn/News/201012/News_1199.htm,这给其应用和开发带来了方便,也见网上有许多实现的例子,出于一个 ...
- SM3国密杂凑值算法的原理和c语言实现
一.SM3算法介绍 杂凑值算法也可称为摘要算法或者哈希算法.通过对数据资料的填充.分组.扩展压缩等方式计算成特定长度的数值,来作为数据指纹或者数据特征使用.常见的MD5算法长度为128bit(16字节 ...
- 国密:生成SM2秘钥、加解密及加验签
国密改造已经持续了很长时间了,相信很多从事金融科技类的程序猿都遇到过这个需求.这篇文章就为大家带来笔者对于国密改造的一些经验,主要是代码层面,有兴趣的同学可以研究下国密的算法模型! 注:本文所用到的工 ...
最新文章
- 数组去重,ES6数组去重 new Set()
- 超过200m文件发送_喜大普奔!微信官宣:最高支持200M高清视频、图片文件!
- sublime text3的php代码合法检查
- spring加载配置文件
- 移动端效果之Picker
- 滚动到页面底部自动加载内容
- python自动化测试常见面试题二_思考|自动化测试面试题第二波
- 1.5 编程基础之循环控制 33 计算分数加减表达式的值 python
- vsftp客户端_vsftp 如何登陆?
- 例4.6 素数判定 - 九度教程第50题(素数筛法)
- 葡萄酒酒进销存单机版_葡萄酒销售问题| 找到销售葡萄酒的最大利润
- 语音测试,串口和adb
- 研华工控机u盘启动安装linux系统,研华工控机610L如何安装win7系统
- 拼多多商品详情百亿补贴数据采集接口代码展示
- YOLOv3 ubuntu 配置及训练自己的VOC格式数据集
- PaddlePaddle运行时出现EnforceNotMet: Enforce failed错误
- 道一HTTP测试工具功能升级
- 三 网络数据分析(1)R语言简单操作
- Unity ECS实现RTS游戏中的游戏单位框选、集结和移动控制
- 直截了当地说,国外的单证硕士到底有没有用?
热门文章
- 优秀编程知识文章-链接汇总(持续更新ing)
- bindtap和catchtap区别
- ios视频通话三方_iOS基于Socket.io即时通讯IM实现,WebRTC实现视频通话
- C语言用随机函数,C语言随机函数的使用
- http://bbs.ichunqiu.com/thread-10048-1-1.html
- PS中各种滤镜效果的实现
- c语言的函数头书写标准,C语言的头文件的函数和书写方法.doc
- 写入grib2+java,Grib数据转换成NC数据
- python数组元素赋值_Python数组中赋值,浅拷贝,深拷贝的区别
- 如何统计列表中每个元素出现的次数