做者:longcppgit
目前主流的簽名機制是基於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中常見的隨機數問題歸入考量,直接在簽名機制內部解決了隨機數產生的問題.dom
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的簽名機制,優點與可能存在的問題以及改進措施.本次咱們首先嚐試去理解蒙哥馬利曲線與扭曲愛德華曲線.區塊鏈