深入理解Ed25519: 蒙哥马利与扭曲爱德华曲线

1,392 阅读4分钟

作者: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的签名机制,优势与可能存在的问题以及改进措施.本次我们首先尝试去理解蒙哥马利曲线与扭曲爱德华曲线.