深入理解Ed25519: 蒙哥馬利與扭曲愛德華曲線

CET_Talk發表於2019-08-05

作者: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的簽名機制,優勢與可能存在的問題以及改進措施.本次我們首先嚐試去理解蒙哥馬利曲線與扭曲愛德華曲線.

相關文章