Updated Home (markdown)

Sun Yimin 2021-02-12 13:38:41 +08:00
parent d4fd34e3e0
commit 77842c6292

@ -1,9 +1,9 @@
最近项目/产品有可能要用到国密商密的SM2加解密及签名验签看了标准文档参考了有关实现发现SM2/SM3本身并不复杂主要是SM2用到的椭圆曲线优化实现比较有难度。网上大部分Golang的SM2椭圆曲线优化实现其实大部分都是那个“神兽护体”的基于Golang NIST P256纯Go语言实现版本并且比较难读。我想要自己实现一遍切实体会一下实现的难度。 最近项目/产品有可能要用到国密商密的SM2加解密及签名验签看了标准文档参考了有关实现发现SM2/SM3本身并不复杂主要是SM2用到的椭圆曲线优化实现比较有难度。网上大部分Golang的SM2椭圆曲线优化实现其实大部分都是那个“神兽压阵”的基于Golang NIST P256纯Go语言实现版本并且比较难读。我想要自己实现一遍切实体会一下实现的难度。
通过阅读Golang NIST P256那个generic的源码并且比较NIST P256和SM2 256曲线参数的异同逐步尝试。 通过阅读Golang NIST P256那个generic的源码并且比较NIST P256和SM2 256曲线参数的异同逐步尝试。
* 首先我要替换掉p256.go中的所有常量这个过程中遇到的最大难点在于**p256Zero31**的求解。 * 首先我要替换掉p256.go中的所有常量这个过程中遇到的最大难点在于**p256Zero31**的求解。
* 其次, 开始解决加法p256Sum和减法(p256Diff)的正确性其难点在于解决进位问题p256ReduceCarry * 其次, 开始解决加法p256Sum和减法(p256Diff)的正确性其难点在于解决进位问题p256ReduceCarry
* 然后就是解决乘法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中而没有删除供后来者参考。期间也和ALI KMS作了集成测试主要是SM2本地加密ALI KMS解密; ALI KMS签名本地验签。 我保留了那些如何求取那些常量和预计算的函数在p256.go中而没有删除供后来者参考。期间也和ALI KMS作了集成测试主要是SM2本地加密ALI KMS解密; ALI KMS签名本地验签。