mirror of
https://github.com/emmansun/gmsm.git
synced 2025-05-11 03:26:17 +08:00
Updated Home (markdown)
parent
996a4e2a2c
commit
200c853f12
5
Home.md
5
Home.md
@ -6,7 +6,7 @@
|
|||||||
* 然后就是解决乘法(p256Mul)的正确性,其最大难点在于蒙哥马利约简实现(p256ReduceDegree),这个花费了很多时间,也是和那个“神兽护体”实现的最大不同。
|
* 然后就是解决乘法(p256Mul)的正确性,其最大难点在于蒙哥马利约简实现(p256ReduceDegree),这个花费了很多时间,也是和那个“神兽护体”实现的最大不同。
|
||||||
* 最后就是求模P的乘法逆元(p256Invert),基于费马小定理(Fermat's Little Theorem),这个就是用平方和乘法算出a^{p-2} = a^{-1} (mod p),关键是凑出p-2。
|
* 最后就是求模P的乘法逆元(p256Invert),基于费马小定理(Fermat's Little Theorem),这个就是用平方和乘法算出a^{p-2} = a^{-1} (mod p),关键是凑出p-2。
|
||||||
|
|
||||||
我保留了那些如何求取那些常量和预计算的函数在p256.go中而没有删除,供后来者参考。
|
我保留了那些如何求取那些常量和预计算的函数在p256.go中而没有删除,供后来者参考。期间,也和ALI KMS作了集成测试,主要是SM2本地加密,ALI KMS解密; ALI KMS签名,本地验签。
|
||||||
|
|
||||||
这个实现的性能,据我测试,在amd64下大概是elliptic.CurveParams默认实现性能的**5**倍。对于这个性能,我还是不甚满意,所以开始学习Golang中NIST P256的特定优化实现,但是这里面有GO ASM,我从来没有接触过。经过一段时间的学习,开始跃跃欲试,我只有amd64,所以从amd64下手,有了32位generic实现的改造经验,本以为会比较顺利,还是从替换曲线参数开始:
|
这个实现的性能,据我测试,在amd64下大概是elliptic.CurveParams默认实现性能的**5**倍。对于这个性能,我还是不甚满意,所以开始学习Golang中NIST P256的特定优化实现,但是这里面有GO ASM,我从来没有接触过。经过一段时间的学习,开始跃跃欲试,我只有amd64,所以从amd64下手,有了32位generic实现的改造经验,本以为会比较顺利,还是从替换曲线参数开始:
|
||||||
* 首先,替换掉p256_asm.go和p256_asm_amd64.s中的常量,这一步还是比较顺利,毕竟有一定经验了。
|
* 首先,替换掉p256_asm.go和p256_asm_amd64.s中的常量,这一步还是比较顺利,毕竟有一定经验了。
|
||||||
@ -15,3 +15,6 @@
|
|||||||
* 然后,测试两个多倍点算法ScalarMult/ScalarBaseMult的正确性,通过和elliptic.CurveParams默认实现来鉴定。到此,sm2的加解密已经可以验证了!
|
* 然后,测试两个多倍点算法ScalarMult/ScalarBaseMult的正确性,通过和elliptic.CurveParams默认实现来鉴定。到此,sm2的加解密已经可以验证了!
|
||||||
* 最后,修改实现`(curve p256Curve) Inverse(k *big.Int) *big.Int`,这个是第一次改造,费了点功夫,这个方法以及CombinedMult方法在签名和验签中有用,能提高性能。
|
* 最后,修改实现`(curve p256Curve) Inverse(k *big.Int) *big.Int`,这个是第一次改造,费了点功夫,这个方法以及CombinedMult方法在签名和验签中有用,能提高性能。
|
||||||
|
|
||||||
|
这个实现的性能,据我测试,在amd64下,加解密大概是elliptic.CurveParams默认实现性能的**50**倍,大概是那个纯golang 32位实现的性能的**10**倍。签名和验签我没做性能测试,不过应该也有很大提高。这个性能已经和SM2基于NIST P256曲线实现的性能相当接近了,考虑到SM2 256曲线的参数复杂度,这个性能算是不错的了。
|
||||||
|
|
||||||
|
剩下的问题,就是使用SM2的问题了,譬如创建证书等等。
|
Loading…
x
Reference in New Issue
Block a user