导论

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

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

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部分

签名验签

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

加解密

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

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

《GM-T 0009》 7.4部分的定义:密钥对保护数据格式(数字信封?)

签名验签

《GM-T 0009》 7.3部分的定义:签名数据格式

《GMT 0003.4》

加解密



SM2加解密、签名验签相关推荐

  1. golang RSA base64 加解密 签名验签

    1.秘钥.加密/签名字符串加密的格式 目前主要见到有hex及base64 (1)hex 针对hex的加解密 import ("encoding/hex" ) hex.DecodeS ...

  2. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 原文:RSACryptoServiceProvider加密解密签名验签和DES ...

  3. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCrypto ...

  4. js rsa验签_js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  5. RSA 加密解密签名验签

    api package v1// get请求 import "github.com/gogf/gf/v2/frame/g"type GetKeyReq struct {g.Meta ...

  6. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  7. iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名

    前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...

  8. 国密算法SM2加解密,签名和验签java语言

    SM2加解密java语言 maven项目 引入bcprov-jdk15on <dependency><groupId>org.bouncycastle</groupId& ...

  9. 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

    国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...

最新文章

  1. 业界丨《自然》:中国打响AI人才争夺战
  2. 陶哲轩实分析 定理 13.4.5
  3. java集合(List,Set,Map)详细总结
  4. linux 常用命令技巧
  5. python 用户输入_Python 用户输入(input)
  6. 九、多表模型创建,一对一,一对多,基于对像的多表模型等
  7. ASP.NET Web Game 架构设计1--服务器基本结构
  8. ASP.NET Core 中间件分类
  9. java i o总结_Java I/O 总结
  10. C++对txt文本进行读写操作
  11. 套现4.88亿美元,百度从此告别外卖!
  12. lhgcoreDialogPlugin v3.5.2 使用点滴
  13. C++ boost::upgrade_lock upgrade_to_unique_lock 升级锁 是什么 怎么用
  14. jQuery文档就绪事件
  15. 百度富文本编辑器UEditor增加自定义字体
  16. 人工神经网络的应用有哪些方面,人工神经网络在生活中的应用
  17. mysql数据库的简单查询一般是查询什么,MySQL的简单查询语句(十五)
  18. CSS Tricks - 你应该知道的 CSS 技巧
  19. 使用python统计excel两文件数据,excel公式为countif
  20. Python文件夹压缩

热门文章

  1. 开发技术指南 | 最全 Substrate 与 Polkadot 技术文档、教程、课程
  2. Excel制作区间范围展示图
  3. 2021年度训练联盟热身训练赛第五场 F,G,H,I
  4. 针对IE浏览器的兼容性ie7、ie8、ie9
  5. 校园跑腿小程序市场需要和功能分析!
  6. 有没有微信相互投票群?
  7. 赛效:Xmind思维导图怎么删除子主题
  8. 我的世界租服务器怎么加组件,我的世界租赁服怎么加自己的mod
  9. 液冷技术或成服务器散热未来趋势
  10. LORA芯片ASR6505无线远距离传输8位MCU