共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。
作者:longcpp
目前主流的签名机制是基于 secp256r1 或者 secp256k1 曲线的 ECDSA 签名机制, 而应用 ECDSA 签名机制时, 稍有不慎就会引发各种安全问题, 具体请参考”ECDSA 在区块链应用中的七宗罪”. 安全之外, 签名机制的效率也是工程落地中的重要考量, OpenSSL 针对曲线 secp256r1 做了深度优化, 签名速度到达大约 30000 次 / 秒, 验签速度达到大约 12000 次每秒, 而 libsecp256k1 中则针对曲线 secp256k1 做了深度优化, 签名速度达到大约 20000 次每秒, 验签速度在同时指定−−enable−endomorphism 和−−with−bignum=gmp 两个选项进行编译后可以达到 19000 次验签每秒(自同态特性的利用可以带来大约 22% 的验签速度的提升, 而 GMP 库的应用则可以为验签过程带来大约 14% 的速度提升, 由于两个速度提升的技术是正交的, 相互叠加之后可以将验签速度从大约 13000 次每秒提升到大约 19000 次每秒). 并且随着技术的改进以及 CPU 新指令的出现, 还可以逐步提升执行速度. 然而更好安全性与更高的执行效率的诉求, 或许无法通过这种小步迭代和缝缝补补方式得到满足.
同时解决前述的应用安全, 实现安全以及执行效率的问题, 要求在工程手段之外更为深度的改进, 一个自然的方向是重新构建椭圆曲线以及签名机制以便在多个层次上同时改进: 改进底层算术运算加速中层点群运算, 中层点群运算适配上层协议, 并在上层签名机制设计时同时考虑 ECDSA 签名机制的问题与局限性加以避免. EdDSA (Edwards-curve Digital Signature Algorithm) 签名机制是这个研究方向上的成果. EdDSA 签名机制是 Bernstein 等人在 2012 年设计的基于爱德华曲线 (Edwards Curves) 的数字签名算法. EdDSA 签名机制是 Schnorr 签名机制的一个变种, 其设计初衷是在不牺牲安全性的前提下提升签名 / 验签速 度, 并同时解决前述的 ECDSA 在应用方面存在的一些问题.
Ed25519 是基于扭曲爱德华曲线 Edwards25519 和 SHA-512 的 EdDSA 签名机制. 其中 Edwards25519 曲线是 Bernstein 等人在 2005 年提出的蒙哥马利曲线 Curve25619 的等价变换形式, Curve25519 的提出是为了加速 ECDH 的计算. 之所以采用 Curve25519 的等价变换形式而不是直接利用 Curve25519 的原因在于 ECDH 与 EdDSA 依赖 的点群运算不同, 这可以看成是为上层协议适配中层点群运算的经典示例. 另外两个曲线在底层有限域的选取中也充分考虑了快速实现与应用编码问题. 而 Ed25519 的签名设计则将 ECDSA 中常见的随机数问题纳入考量, 直接在签名机制内部解决了随机数产生的问题.
Ed25519 带来了安全性和性能方面多个维度的改进, 但是其底层的扭曲爱德华曲线或者等价的蒙哥马利曲线相比 secp256k1/secp256r1 曲线的 short-Weierstrass 形式来说, 显得尤为陌生. 为了深入理解 Ed25519 签名机制, 首先需要理解这三种曲线形式之间的关系. 从广义 Weierstrass 形式变换成为 short-Weierstrass 形式, short-Weierstrass 形式与蒙哥马利形式曲线的变换以及蒙哥马利形式与扭曲爱德华曲线之间转换请戳阅读原文.
另外,Ed25519 也确实引入了一个在基于 secp256k1 或者 secp256r1 的 ECDSA 签名机制中不存在的问题. 一个由于椭圆曲线的余因子 (cofactor) 不为 1 导致的问题, 使得 Monero 中可以八花一笔交易(问题已经被修正).secp256k1 和 secp256r1 的余因子为 1, 所以无需考虑余因子的问题, 也不会引发安全问题. 而 Edwards25519 的余因子为 8, 此时就不得不在应用时将余因子纳入考量的范畴. 而余因子为 8 也部分影响了 Ed25519 签名机制的设计. 然而在上层协议设计中不断为底层曲线填坑不是我们喜欢的方式, 也因此有了相应的应对措施. 随后我们会逐步讲解 Ed25519 的签名机制, 优势与可能存在的问题以及改进措施. 本次我们首先尝试去理解蒙哥马利曲线与扭曲爱德华曲线.