首页logo
  •  

jonllen

金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。

个人档案

jonllen
心情闪存 | 给他留言
妮称:jonllen
来自:中国. 湖南. 湘潭
简述:金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。
博客日历

国密算法SM2证书制作

分类:工作

前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密算法DES(AES)和摘要MD5(SHA1)也相应改变,分别对应SM1、SM3算法,SM1算法基于硬件实现,SM2、SM3算法已公开。

SM2签名验证算法

SM2签名同样也是需要先摘要原文数据,即先使用SM3密码杂凑算法计算出32byte摘要。SM3需要摘要签名方ID(默认1234567812345678)、曲线参数a,b,Gx,Gy、共钥坐标(x,y)计算出Z值,然后再杂凑原文得出摘要数据。这个地方要注意曲线参数和坐标点都是32byte,在转换为BigInteger大数计算转成字节流时要去掉空补位,否则可能会出现摘要计算不正确的问题。SM2签名实现如下:

SM2签名

SM2算法是基于ECC算法的,签名同样返回2个大数,共64byte。由于原来RSA算法已很普遍支持,要实现RSA的签名验签都有标准库的实现,而SM2是国密算法在国际上还没有标准通用,算法Oid标识在X509标准中是没定义的。在.Net或Java中可以基于使用BouncyCastle加密库实现,开源的也比较好学习扩展。SM2算法验签可以使用软验签,即可以不需要使用硬件设备,同样使用原始数据、签名、证书(公钥)来实现对签名方验证,保证数据完整性未被篡改。验证过程同样需先摘要原文数据,公钥在证书中是以一个66byte的BitString,去掉前面标记位即64byte为共钥坐标(x,y),中间分割截取再以Hex方式转成BigInteger大数计算,验签代码如下:

SM2验签

制作SM2证书

基于BouncyCastle开源库,可以轻松制作X509证书、CRL、pkcs10、pkcs12,支持国际通用的RSA、ECC算法。制作SM2证书可以通过扩展BouncyCastle库来实现,需加入SM2签名算法DerObjectIdentifier标识1.2.156.10197.1.501(基于SM3的SM2算法签名),密钥对的生成使用国密推荐曲线参数,然后如上所示自行实现SM2签名验证算法。X509证书由证书主体、证书签名算法标识、签名组成,和RSA证书主要不同的是SM2证书的签名算法标识和签名,及证书公钥使用ECKeyParameters。生成自签名SM2证书代码如下:

SM2证书生成

X509证书使用ASN1语法进行编码,是用类型标识、长度和值序列来描述数据结构的。SM2证书在制作设置公钥时,默认会带ECKeyParameters参数,并没有SM2的公钥参数1.2.156.10197.1.301,因此需要自己写个SM2椭圆曲线密码算法标识对象,这样在生成的证书中就可以看到公钥参数字段,如下所示:

SM2证书公钥标识

SM2算法是国密局公布的公钥密码算法,在相当强度下密钥比RSA短,在使用智能卡有限空间存储时非常可贵。目前国内很多CA大都升级支持SM2算法证书,相信以后会慢慢地推广更多应用,也期望之后能与国际标准接轨。

附:

国密推荐256位曲线参数

  • 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国密算法测试示例

标签:工作
  • posted@ 2013-06-26 23:03
  • update@ 2013-06-28 22:14:58
  • 阅读(20247)
  • 评论(51)

相关文章

评论
1楼 wahely 2013-10-09 10:11:55
SM2CryptoServiceProvider是在哪里实现的,能给一份吗?谢谢。wahel30615571@126.com
回复:我这里是依赖BouncyCastle库实现的,我只是封装了下计算Z值和生成SM2密钥对的方法。(2013-10-09 11:19:43)
2楼 wahely 2013-10-10 15:01:27
我需要的就是这两个方法,如方便的话能否发到我的邮箱,十分感谢。
回复:SM2CryptoServiceProvider类中取Z值主要是计算用户ID和公钥摘要;
SM3Digest类中主要是SM3杂凑摘要算法;
已发送至你邮箱了。(2013-10-11 22:43:13)
3楼 grace 2013-11-18 15:43:23
评论内容需要审核才能显示。
4楼 grace 2013-11-18 15:43:25
请问楼主,BC有sm3摘要计算和SM3_WITH_SM2签名的API吗?谢谢楼主
回复:BouncyCastle库只有标准的RSA和ECC算法实现,没有SM3、SM2国密算法Oid项的。(2013-11-19 19:40:16)
5楼 xiaop 2014-03-05 17:12:27
请教楼主一下,修改了bouncycastle的Java版源码怎么打成可用的jar通过JCE调用呢,好像Sun要求jar是通过他们签名的才行,个人修改过的BC只能调一般的API不能作为JCE Provider提供出来,有没有办法绕过,谢谢
回复:bouncycastle的版源码可以不直接修改,自己在项目中来引用BC库然后再自己写类这样比较好.(2014-03-09 21:20:11)
6楼 xiaop 2014-03-12 14:04:06
引用xiaop:请教楼主一下,修改了bouncycastle的Java版源码怎么打成可用的jar通过JCE调用呢,好像Sun要求jar是通过他们签名的才行,个人修改过的BC只能调一般的API不能作为JCE Provider提供出来,有没有办法绕过,谢谢

感谢博主
回复::)(2014-03-12 21:55:34)
7楼 etta 2014-03-25 11:04:13
您好,最近正在学习这方面的知识,请问您能发一份给我吗~?谢谢
8楼 etta 2014-03-28 09:26:42
评论内容需要审核才能显示。
9楼 wstxdyjk 2014-03-31 16:12:16
SM2国密算法测试示例中,推荐曲线签名时怎么没有私钥输入?验证签名时签名数据框里的数据应该填写什么数据?
回复:我在SM2国密算法推荐曲线签名测试示例中是自签名的,主要是为了生成密钥对进行验证签名。(2014-04-01 12:56:57)
10楼 TKljx 2014-07-02 13:56:58
你好啊,请问SM2CryptoServiceProvider类的实现方便给我一份吗,感谢
279622644@qq.com
11楼 TKljx 2014-07-02 13:57:01
评论内容需要审核才能显示。
12楼 TKljx 2014-07-02 13:57:02
评论内容需要审核才能显示。
13楼 treasure 2014-07-05 17:16:26
评论内容需要审核才能显示。
14楼 wuwei 2014-08-07 10:27:45
评论内容需要审核才能显示。
15楼 zzh 2014-08-07 10:29:26
评论内容需要审核才能显示。
16楼 fenggaowei 2014-09-03 16:54:58
请问你这个地址做的sm2签名验签名,userid用的是多少?
http://www.jonllen.com/Demo/SM3WithSM2.aspx
回复:SM2推荐曲线签名验证是用的2个12345678。(2014-09-03 21:00:58)
17楼 liyh 2014-09-16 16:21:08
楼主能否讲一下:SM2国密算法测试示例 的每一项具体是什么,怎么用
回复:建议参考国家密码管理局的SM2椭圆曲线公钥密码算法和SM3密码杂凑算法资料,算法目前已经公开了的。(2014-09-16 22:17:52)
18楼 yyhakusu 2014-10-21 10:07:33
楼主你好,我用你的代码验签验不过,公钥是在证书里取到的。另外你在http://www.eccsdk.com/bbs/read.php?tid=5408
这个论坛上发的这个问题应该和我遇到的是一样的,怎么解决的呢?谢谢
回复:那个是Byte转BigInteger问题,你用16进制方式转BigInteger大数了。(2014-10-21 23:09:38)
19楼 yyhakusu 2014-10-22 08:40:37
我用这篇文章的代码验也验不过,SM2getz这个函数跟那个帖子中的是一样吗?签名值是der编码过的吗?在.net里转biginteger用这里的代码就可以吗?
20楼 yyhakusu 2014-10-23 09:56:59
你用的BC是哪个版本啊?自己改过吗
回复:用的bcprov-jdk15on-151这个版本。(2014-11-20 20:51:27)
21楼 kevin 2014-10-27 08:51:39
麻烦楼主把计算Z值和sm3算法的方法发我一份好吗?zhangvhao@163.com
谢谢!
22楼 spacetime123 2014-11-18 12:05:17
引用kevin:麻烦楼主把计算Z值和sm3算法的方法发我一份好吗?zhangvhao@163.com
谢谢!


可以发我一份吗?sm2算法实现(签名+加解密+协商实现)
另外请问由自己实现的Provider吗?经过sun签名吗?
回复:没有经过sun签名,只是引用了bouncycastle库。(2014-11-20 20:48:44)
23楼 spacetime123 2014-11-18 13:00:57
好像前面回复都失败了?点提交没反应,我不确定成功没。
我的邮箱spacetime123@126.com
谢谢
24楼 spacetime123 2014-11-19 14:27:14
我也遇到了,很困惑,那些参数包括ID及其长度、公钥坐标到底该用什么格式储存和调用?
25楼 operamasks 2014-12-25 16:32:46
楼主能否将SM2CryptoServiceProvider发一份给我?谢谢!18682133817@163.com
26楼 demonboa 2015-03-17 16:59:43
楼主,您好,方便的话,能否发SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现到我邮箱184536519@qq.com,谢谢!!
27楼 Stephen 2015-05-07 15:03:23
1
28楼 Stephen 2015-05-07 15:03:57
SM2CryptoServiceProvider是在哪里实现的,能给一份吗?谢谢。
743574255@qq.com
29楼 justin 2016-01-26 14:48:24
你好,代码能给我发一份吗,学习用,谢谢了!
30楼 明明 2016-03-20 21:48:47
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱1029222560@qq.com,谢谢!!
31楼 明明 2016-03-20 21:48:49
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱1029222560@qq.com,谢谢!!
32楼 openssl 2016-04-01 14:34:03
你好,我在实现计算椭圆曲线点的时候的问题:(x0’,y0’)=[s’]G s 是签名的后半部分 G 是 基点 [s’]G :是如何计算?s*G或 s*Gx,s*Gy 还是其他计算。使用的是openssl 库,谢谢
33楼 小李 2016-04-05 00:51:26
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱475168571@qq.com,谢谢!!
34楼 lhb 2016-04-25 20:07:17
我找的例子用私钥算出公钥的结果和你这里相同,但加密后的密文在你这里却接不出来。这是什么原因呢?还有按照国家文档的例子,加密后的密文长度比明文多了不止96字节。。。
35楼 小白 2016-05-09 16:28:06
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱19174163@qq.com,谢谢!!
36楼 xiaonan 2016-05-16 17:18:39
楼主,方便帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱983937055@qq.com,谢谢!!!
37楼 筱楠 2016-05-17 18:03:17
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱983937055@qq.com,谢谢!!!
38楼 黑色的云 2016-05-20 16:34:31
楼主方便的话,发送一下SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个实现类的源码发送一下到我的邮箱:361482674@qq.com; 非常感谢
39楼 feng 2016-05-22 15:48:41
楼主,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱13101716280@163.com,谢谢!!
40楼 安迪 2016-05-22 15:51:11
大哥,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱13101716280@163.com,谢谢!!
41楼 安迪 2016-05-22 15:51:14
大哥,方便的话帮忙把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱13101716280@163.com,谢谢!!
42楼 小张 2016-05-23 15:54:43
楼主,目前我也在研究用sm2算法生成证书和签名,还请麻烦你把SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现放到我邮箱284255234@qq.com,提供给我以学习和研究,麻烦了~
43楼 天津 2016-05-25 20:37:55
楼主,您好,有时间方便的话,能否发SM2CryptoServiceProvider和SM2X509V3CertificateGenerator这两个的实现到我邮箱310168722@qq.com,谢谢了,好人一生平安。
44楼 qianlicao1046 2016-06-06 15:41:19
博主,能否把SM2CryptoServiceProvider、SM2X509V3CertificateGenerator和GetDictionaryKeys的实现发到我邮箱:1046162769@qq.com麻烦啦,谢谢!
45楼 qianlicao1046 2016-06-06 15:41:20
博主,能否把SM2CryptoServiceProvider、SM2X509V3CertificateGenerator和GetDictionaryKeys的实现发到我邮箱:1046162769@qq.com麻烦啦,谢谢!
46楼 qianlicao1046 2016-06-06 15:44:05
博主,能否把SM2CryptoServiceProvider、SM2X509V3CertificateGenerator和GetDictionaryKeys的实现发我一份,邮箱:1046162769@qq.com,麻烦啦,谢谢!
47楼 qianlicao1046 2016-06-08 15:27:49
博主,能否发SM2CryptoServiceProvider、GetDictionaryKeys和SM2X509V3CertificateGenerator这三个的实现到我邮箱1046162769@qq.com,麻烦啦,谢谢!
48楼 千里草 2016-06-08 15:34:10
博主,方便的话帮忙把SM2CryptoServiceProvider、GetDictionaryKeys 和SM2X509V3CertificateGenerator这三个的实现放到我邮箱1046162769@qq.com,麻烦啦,谢谢!
49楼 john 2016-07-26 14:38:17
博主,方便的话帮忙把SM2CryptoServiceProvider、GetDictionaryKeys 和SM2X509V3CertificateGenerator这三个的实现放到我邮箱1046162769@qq.com,麻烦啦,谢谢!
发表评论
*必填
回复通知我
*必填