至此,我们已经完完全全的实现了国密SM2算法,终章就把我用汇编实现的时候,用到的一些优化方法总结给大家。

# 大数算法优化

大数乘法,参数P模乘和参数N模乘是不一样的,参数P模乘的时候,t的值是1,所以会少一个乘法,汇编代码也会减少很多。

大数平方,这个要单独用汇编写,因为平方与乘法不一样,能少一部分乘法。

大数模逆,这个的优化在对应章节已经给出来参考,大数模逆优化

# 点算法优化

多倍点的优化,可以采用滑动窗法,滑动窗法针对[k]·G,由于G固定,可以做预计算。这里给出一个耗时参考。

saintdeMacBook-Pro:YiSecureBoxCPP saint$ time cmake-build-debug/obn_add zpoint_mul
test start...
r = 6CBB13143526BE4C6565BA1061C5835E3C61A5DC10B6CD5824C1F6A93B368F6D86B89F0A0459A745F5A192827E5CDCE9CB035DBFEAC286ADCD8F62C4C028567B
r == er : 0
test end.

real	0m0.148s
user	0m0.136s
sys	0m0.004s
saintdeMacBook-Pro:YiSecureBoxCPP saint$ time cmake-build-debug/obn_add zg_point_mul
test start...
r = F7C332634D5A9C142523489FF259EF11AD347D08B37291ED1FA8D8855203C1E0E08495FFF95BF87F3DE46F74DDF519D9E20FFB48E01AE7103A7043C4FE8D22D6
r == er : 0
test end.

real	0m0.040s
user	0m0.034s
sys	0m0.003s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

可以看出,采用滑动窗法执行普通乘法1千次需要0.148s,而经过预计算[k]·G,只需要0.04s。

所以在实现签名及验签算法时,乘以G的部分,要另外实现,可以大大提高算法效率。

# 社区优化

如果你有其它优化方法,欢迎向我发邮件分享,我的邮箱地址是ikantech@163.com,也可以在对应仓库提交issues。