From 200c853f125c3c6b46bfc206f4a6e385d1e5ec26 Mon Sep 17 00:00:00 2001 From: Sun Yimin Date: Thu, 11 Feb 2021 13:15:45 +0800 Subject: [PATCH] Updated Home (markdown) --- Home.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Home.md b/Home.md index 5ad3bc4..ad23b29 100644 --- a/Home.md +++ b/Home.md @@ -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的问题了,譬如创建证书等等。 \ No newline at end of file