首页logo
  •  

jonllen

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

个人档案

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

SM2非对称算法加解密

分类:工作

在前面文章我们已经可以制作SM2证书了,主要应用了SM2签名验证算法和SM3摘要算法,在本文中主要介绍SM2公钥加密算法。这里我们使用SM2数字证书来做SM2非对称加密,然后使用硬件加密设备做解密,比如加密文件只能由指定的智能密码钥匙UKey才能解开。

SM2加密算法

SM2加密同样使用接收方公钥加密,公钥由一个曲线坐标点组成,在X.509证书中的共钥表示为04标记开始的2个32byte的BigInteger,即曲线点P(x,y)。SM2公钥加密算法比RSA相对复杂,加密结果由3个部分组成,SM2加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。SM2加密算法流程如下图所示。

根据国密推荐的SM2椭圆曲线公钥密码算法,首先产生随机数计算出曲线点C1,2个32byte的BigInteger大数,即为SM2加密结果的第1部分。第2部分则是真正的密文,是对明文的加密结果,长度和明文一样。第3部分是杂凑值,用来效验数据。按国密推荐的256位椭圆曲线,明文加密结果比原长度会大96byte。

SM2加密算法同样也可以基于使用BouncyCastle库实现。一般使用数字证书来标识身份,同时使用证书中公钥加密数据。如下SM2Cipher类是C#下SM2软算法实现。

SM2Cipher.cs

SM2解密算法

SM2解密算法是加密逆运算。首先需要从密文中取出加密结果的3部分值,然后通过私钥计算出 M'明文值,最后效验数据。SM2解密算法流程如下图所示。 

 SM2解密同样也可以使用软算法实现。但因为涉及到私钥运算,为保护私钥安全,建议在硬件设备中运行,例如UKey等存储介质这样可以更好的保护密钥安全。拿文件加密来说,首先拿UKey里面的加密证书加密,这部分可在应用系统内完成。解密的话则需要加密证书对应UKey才能做解密,由应用系统调用UKey解密接口,在物理硬件内完成数据解密,同时可以受设备Ping码保护。

附:SM2算法加解密在线测试工具

标签:工作
  • posted@ 2013-07-28 23:20
  • update@ 0001-01-01 00:00:00
  • 阅读(17782)
  • 评论(20)

相关文章

评论
1楼 zhiyonggong 2014-02-14 15:16:09
你的这篇文章,给我的工作提供了很大帮助。特别是测试Demo.谢谢。
回复::)(2014-02-16 22:13:14)
2楼 121212121 2014-02-24 11:11:36
评论内容需要审核才能显示。
3楼 121212121 2014-02-24 11:12:35
您好!我看了您SM2加解密测试的文章,非常感谢您提供的在线测试工具!但我有个问题想问下,如果我要测试别人的SM2算法正确与否,我怎样才能找到这样的测试数据呢,因为算法里面有随机数,每次都在变化。标准里只是给了一组数据,随机数也是给定的,那这样的数据比较有局限性,应该怎样测试呢?
回复:SM2加密结果中C1是随机数,可以用私钥解密看SM2公私钥是否匹配。(2014-03-03 21:22:59)
4楼 121212121 2014-03-06 17:31:37
您好!谢谢您的解答!您的意思是调用加密接口得到密文,然后再用解密接口解密吗?那这样没有中间结果比对,会不会存在自己解密自己解密接口本身有问题呢?比如说,现在新标准的加密结果是C1‖C3‖C2,而老标准是C1‖C2‖C3,如果自己验自己的接口,就不会有问题。有没有第三方的接口,或是别的测试数据可以借鉴呢?或是通过别的方法来验证SM2加解密算法的正确性?
回复:一般不会别人加密接口有问题,自己的接口也有问题,还能解密成功吧?一般都是连密码设备作加解密的,用的是C1C2C3还是C1C3C2标准这个可以知道的。(2014-03-09 21:25:55)
5楼 121212121 2014-03-10 15:53:28
您好!我现在遇到的问题是没有别人的接口,所以测起来比较头疼!您的加解密接口我颠倒下数据就可以用,谢谢!不知道您有没有前面验签的测试工具呀,如果方便的话能否给我发一份呢!
回复:这个一般连密码设备做的,密码机和UKey里都会提供这些函数的。(2014-03-10 21:28:23)
6楼 yupeng_wu 2014-04-14 09:07:29
您好 我用了东方新诚信的USBKey 支持国密 想实现安全文件加密传输 他们技术支持回复说要安装国密标准一步步 那边又不提供资料 我想问下您通常的解决方案是什么呀 编写控件应该注意什么呢
回复:使用SM2非对称密钥加密会话密钥,再用对称密钥加密文件。解密先用私钥解开会话密钥再解密密文。(2014-04-15 13:01:50)
7楼 泉 2014-05-26 11:39:22
在线签名很明显不正确,每次点击“签名”按钮其结果都一样,应该每次点击“签名”后,签名结果不同
回复:谢谢提醒,我之前测试SM2曲线是使用的固定变量k值签名,应该是要生成随机变量k进行签名的。(2014-06-17 10:00:46)
8楼 过客 2014-09-05 14:44:05
您好,刚接触加解密算法,很多问题不是很懂,能发给我一份SM2加解密的源码吗?谢谢!
9楼 oracle_cs 2015-08-27 14:34:42
您好,我最近也在研究国密这块,您上面的加密中用到了SM2CryptoServiceProvider,您能把这个实现发给我邮箱吗? 1607418266@qq.com
10楼 oracle_cs 2015-08-27 14:34:44
您好,我最近也在研究国密这块,您上面的加密中用到了SM2CryptoServiceProvider,您能把这个实现发给我邮箱吗? 1607418266@qq.com
11楼 郭青山 2016-03-07 17:11:22
您好,我最近也在研究国密这块,您上面的加密中用到了SM2CryptoServiceProvider,您能把这个实现发给我邮箱吗?704299375@qq.com 谢谢!
12楼 lyvslu 2016-04-08 20:11:31
您好,我最近也在研究国密这块,您上面的加密中用到了SM2CryptoServiceProvider,您能把这个实现发给我邮箱吗?823106498@qq.com谢谢!
13楼 刘宇莹 2016-04-21 08:31:17
[quote]oracle_cs:您好,我最近也在研究国密这块,您上面的加密中用到了SM2CryptoServiceProvider,您能把这个实现发给我邮箱吗? 975071049@qq.com[/quote]
14楼 lhb 2016-04-24 21:25:15
您好!请问知道了公钥,怎么求公钥的坐标呢。EC_POINT_hex2point这个函数我不会使用,有例子吗?
回复:用SM2曲线参数和公钥的XY值,就可以获取坐标点对象(2016-04-24 21:53:33)
15楼 lhb 2016-04-24 22:09:49
很高兴你能够回复,我现在项目需要到这个算法。我就是知道公钥啊,公钥是"16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45",然后我怎么获取公钥的坐标。你说的是已经知道坐标的情况了啊。。。
回复:SM2证书结构中的获取的公钥数据是04开头的,后面64字节中间截取后就是公钥XY值呀(2016-04-24 22:20:03)
16楼 lhb 2016-04-24 22:23:29
我的客户银行就说公钥是 “16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45",难道他给的不全? 说明:获取素数域上椭圆曲线上某个点的x和y的几何坐标; int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point,BIGNUM *x, BIGNUM *y, BN_CTX *ctx) 网上这个函数我怎么使用都提示到段错误
17楼 lhb 2016-04-24 22:28:47
将buf中表示的十六进制数据转化为椭圆曲线上的点; EC_POINT *EC_POINT_hex2point(const EC_GROUP *group,const char *buf,EC_POINT *point,BN_CTX *ctx)
18楼 lhb 2016-04-24 22:33:51
我的没有那么复杂,就直接给公钥了。但还是很难的。。谢谢啦
19楼 lhb 2016-04-25 20:36:08
我找到的一个例子用私钥生成公钥和你这里一样,但是密文不同,难道是我哪里错啦,还有用国家文档的例子放你这里好像密文也不一样
20楼 naohailongwang 2016-05-23 16:38:59
大神你好,这个SM2CryptoServiceProvider有什么功能?能发源代码学习一下吗?(不好意思,做了伸手党)谢谢!253713735@qq.com
发表评论
*必填
回复通知我
*必填