开始老大让我搞国密算法,就去官网下了一文档
地址【http://www.oscca.gov.cn/News/201012/News_1197.htm】
下回来对于应该怎么开始是一头雾水,也没看目录就一页页地看,很没效率
一、文档分了四部分,第一部分是对于ECC的解释说明,实现计算之类。
第二,三,四部分,看你要往哪部分用再去看。
我这用的是数字签名,也就是得清楚,第一二部分。
我就只按照我做的来讲了,实现签名的加密与验证,其中较大的两人部分是ECC倍点,还有哈希。
一、1.先讲哈希
这里用的哈希也就是官方文档SM3中的杂凑算法,这个实现中要做的基本就是与、或、异或、非的运算。
其中有一点我在开始实现的时候不明白是,一个模32的加法运算,其实就是两32位的数相加,不管进位的加法。
实现后,我在PC上运行大约为20ms,应该是可优化的。
文档中还给出了测试数据,相当好用
如果还想知道SS1、SS2、TT1、TT2的中间数据,可以找我要
一、2 ECC倍点
这点用到的也就是SM2文件中的第一部分总则中讲的核心内容,那就是怎么快速实现倍点的计算
这里大概说下,因为要用到图。在官方文档中没有,在y^2 = x^3 + x+ 1时候,曲线是左边一个闭合曲线,右边是一条开口的曲线,能过不停地点的映射来实现倍现
更加形象的带图的说明,请下载文档
这不是我做的,感谢原作者,由于我找不到原一址了,就又上传了一回【http://download.csdn.net/detail/conquerwave/5639269】
关于椭原曲线点加原理更多的解说,《哈代数论》25.2椭圆曲线加法法则 解释得比较清楚
SM2的官方文档第一部分的其它内容就是对这种加密方法的验证,还有某些算法快速实现的介绍
如果想更深入地了解椭圆曲线加密的原理可以去这下一本书
【http://download.csdn.net/detail/conquerwave/5463667】
中文版的“椭圆曲线密码学导论”,我没分了,希望能友情下载一下,谢谢
多倍点实现中的中间数据可以和这里地对照一下,看是否正确,地址【http://download.csdn.net/detail/conquerwave/5529407】
到这里SM2的第一部分也就介绍完了
二、实现
2.1 关于数学计算库
有关的数学计算库看官可以自己搜一下,由于我要移植,不能用库,尽量不使用别的资源,代码占用空间尽可能地小,我这也就被限制了。
在我给的第一个链接中的博主给出了自己调用openssl库的实现,这速度很快,我的和这没法比,模拜一下。
要用的话得安装openssl的函数库,这也就不说了,相信看这文章的人都能搞定这事。
我还另外参考了libtomath的数学计算库,这库比较小,说明文档很全,pudn中也有用这库实现的例子。
2.2 我的实现
大数运算中要实现加、减、乘、整除、模逆、取模
加、减用最普通的笔算方式实现就行
乘法用comba优化的笔算计算方式能优化一些,更好的优化还在研究,有兴趣地可以联系我。
整除我用的方法是移位比较做减法
模逆用的是文档中推荐的扩展欧几里得算法,所说是最快的,但感觉我的时间全花在这了。对于这一算法解释的好的帖子【www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html】感谢原作者
取模的方法和整除差不多。
这里我贴上我的第一版的计算实现函数【http://download.csdn.net/detail/conquerwave/5529607】这是第一版,没有优化
如果你有兴趣将其完善,希望你能找我一起做这事,谢谢
2.3 运行时间
在我的PC上运行,在2.1节中提到的博主花的时间几乎为0s,我的实现花去8秒多,第一版的时间在60秒左右,测试数据为官文第二部分的K倍点计算
目前我就做到这,还得继续优化数学计算部分
希望有兴趣和我一起实现库的朋友能联系我[email protected] 新浪微博‘我叫王小才’