Updated Home (markdown)

Sun Yimin 2021-02-12 13:22:45 +08:00
parent 8459603aeb
commit 54bb186013

@ -13,7 +13,7 @@
* 接着就是要修改p256_asm_amd64.s中的实现了主要是蒙哥马利约简模P的和模N的实现原本的实现都是基于NIST P256的参数P和N进行优化的改造起来困难挺大为了验证结果对每个主要的asm实现方法都写了测试保证正确性。本以为有了32位generic实现的改造经验会比较顺利实际情况是在这一步反反复复几度曾想放弃。说老实话到目前为止我也还是不能认清p256_asm_amd64.s中用到的所有Golang ASM的命令。 * 接着就是要修改p256_asm_amd64.s中的实现了主要是蒙哥马利约简模P的和模N的实现原本的实现都是基于NIST P256的参数P和N进行优化的改造起来困难挺大为了验证结果对每个主要的asm实现方法都写了测试保证正确性。本以为有了32位generic实现的改造经验会比较顺利实际情况是在这一步反反复复几度曾想放弃。说老实话到目前为止我也还是不能认清p256_asm_amd64.s中用到的所有Golang ASM的命令。
* p256_asm.go中p256Inverse的改造因为有经验比较顺利。 * p256_asm.go中p256Inverse的改造因为有经验比较顺利。
* 然后测试两个多倍点算法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`,这个是第一次改造,费了点功夫,通过学习[算法](https://briansmith.org/ecc-inversion-addition-chains-01#p256_scalar_inversion),算是比较顺利。这个方法以及CombinedMult方法在签名和验签中有用能提高性能。
* 持续优化蒙哥马利约简主要是根据P这个素数的特性`T3=T+(T mod 2^64)*PT = T3 / 2^64`,努力减少乘法。 * 持续优化蒙哥马利约简主要是根据P这个素数的特性`T3=T+(T mod 2^64)*PT = T3 / 2^64`,努力减少乘法。
这个实现的性能据我测试在amd64下加解密大概是elliptic.CurveParams默认实现性能的**50**倍大概是那个纯golang 32位实现的性能的**10**倍。签名和验签我没做性能测试不过应该也有很大提高。这个性能已经和SM2基于NIST P256曲线实现的性能相当接近了考虑到SM2 256曲线的参数复杂度这个性能算是不错的了。 这个实现的性能据我测试在amd64下加解密大概是elliptic.CurveParams默认实现性能的**50**倍大概是那个纯golang 32位实现的性能的**10**倍。签名和验签我没做性能测试不过应该也有很大提高。这个性能已经和SM2基于NIST P256曲线实现的性能相当接近了考虑到SM2 256曲线的参数复杂度这个性能算是不错的了。