Updated Home (markdown)

Sun Yimin 2021-02-11 13:15:45 +08:00
parent 996a4e2a2c
commit 200c853f12

@ -6,7 +6,7 @@
* 然后就是解决乘法p256Mul的正确性其最大难点在于蒙哥马利约简实现p256ReduceDegree这个花费了很多时间也是和那个“神兽护体”实现的最大不同。
* 最后就是求模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实现的改造经验本以为会比较顺利还是从替换曲线参数开始
* 首先替换掉p256_asm.go和p256_asm_amd64.s中的常量这一步还是比较顺利毕竟有一定经验了。
@ -15,3 +15,6 @@
* 然后测试两个多倍点算法ScalarMult/ScalarBaseMult的正确性通过和elliptic.CurveParams默认实现来鉴定。到此sm2的加解密已经可以验证了
* 最后,修改实现`(curve p256Curve) Inverse(k *big.Int) *big.Int`这个是第一次改造费了点功夫这个方法以及CombinedMult方法在签名和验签中有用能提高性能。
这个实现的性能据我测试在amd64下加解密大概是elliptic.CurveParams默认实现性能的**50**倍大概是那个纯golang 32位实现的性能的**10**倍。签名和验签我没做性能测试不过应该也有很大提高。这个性能已经和SM2基于NIST P256曲线实现的性能相当接近了考虑到SM2 256曲线的参数复杂度这个性能算是不错的了。
剩下的问题就是使用SM2的问题了譬如创建证书等等。