深入理解Ed25519: 原理與速度

買賣虛擬貨幣

Edwards-curve Digital Signature Algorithm (EdDSA) 是定義在(扭曲)愛德華曲線上的Schnorr 簽名的變種簽名機制. Ed25519 是 Bernstein 等人在2011年基於與蒙哥馬利曲線 Curve25519 雙向有理等價的扭曲愛德華曲線 Edwards25519 構建的 EdDSA 簽名機制. Ed25519 簽名機制的顯著特點是安全高效, 設計者們宣稱在128位元安全強度條件下Ed25519 簽名機制可達到10/秒的簽名速度和7/秒的驗籤速度。

2015年 Bernstein 等人在論文”EdDSA for more curves”中進一步推廣了 EdDSA 簽名機制,以使得 EdDSA 簽名機制可適用於更多的橢圓曲線. NSA 在 NIST 密碼學安全的隨機數隨機數發生器 Dual_EC_DRBG 標準中埋藏的演算法級後門的公開促使人們更傾向於選擇設計機制完全透明的 Curve25519 曲線. 又由於 EdDSA 簽名機制提供的諸多良好特性, 使得 Ed25519 簽名機制備受歡迎, 因此有了 RFC 8032 以 RFC 的形式進一步明確了 EdDSA 簽名規範,並基於Edwards25519曲線(128位元安全強度)Ed448-Goldilocks 曲線(224位元安全強度) 給出了5種例項化的 EdDSA 簽名機制: Ed25519, Ed25519ctx, Ed25519ph, Ed448以及Ed448ph。

根據 RFC 8032 中的說明, EdDSA 簽名機制有兩種版本 PureEdDSA 和 HashEdDSA,其中 PureEdDSA 直接對待簽名訊息計算簽名值(而非我們熟知的對訊息的雜湊值計算簽名值), 而 HashEdDSA 遵循我們熟悉的模式先對待簽名訊息進行雜湊運算然後對雜湊值進行簽名. 也因此 HashEdDSA 在出現雜湊碰撞的情況下無法保證簽名機制的安全性, 而雜湊碰撞不會影響 PureEdDSA 簽名機制的安全性。

重點關注基於 Edwards25519 例項化的 EdDSA 簽名機制: Ed25519, Ed25519ctx以及Ed25519ph. Ed25519 和 Ed25519ctx 可以看作是 PureEdDSA 的例項化, Ed25519ph可以看做 HashEdDSA 的例項化. 三個變種簽名演算法內部都採用 SHA-512 演算法.區別在於 Ed25519ph 是對訊息的 SHA-512 雜湊值計算簽名值, 而 Ed25519, Ed25519ctx 直接對訊息計算簽名值. Ed25519 和 Ed25519ctx 的主要區別在於 Ed25519ctx 可以額外包含一個上下文環境引數(Ed25519ph 也可以包含上下文環境引數) context, 這個引數可以用來對簽名機制在不同場景下的應用進行區分, 以防止簽名機制在不同用途之間的混用,簡化協議的設計。

在學術論文宣稱的速度指標與工業界廣泛部署的函式庫的速度指標通常存在差異. 在介紹基本原理之外我們還考察廣泛使用的幾個密碼學庫中 Ed25519 簽名機制的實現效率,包括C語言庫 libsodium, OpenSSL, Go 語言密碼庫以及 Rust 語言庫ed25519-dalek. 測試結果顯示 libsodium, OpenSSL 以及 Go 語言密碼庫中的 Ed25519 驗籤速度相比libsecp256k1 中最佳化選項全開的 ECDSA 驗籤速度較慢. 而 ed25519-dalek Ed25519的實現速度喜人, 在開啟 AVX2 選項時可達到47000 sign/s27200 verify/s.考慮批次驗證時, 例如批次驗證256個簽名值時,則可以到每秒驗證64800個簽名的效果. 高速的驗籤速度在區塊鏈場景中至關重要,也因此筆者認為後續的區塊鏈專案中會更傾向於採納 EdDSA 簽名機制, 已有的專案案例包括比原鏈, Monero, Zcash, Cosmos以及Polkadot。

EdDSA 簽名機制本身的設計已經儘可能防止使用中的差錯, 然而在區塊鏈專案中部署EdDSA 簽名機制還是面臨諸多挑戰. 這一方面是由於扭曲愛德華曲線中點群的餘因子通常不為1可能帶來的在區塊鏈系統中的安全隱患,另一方面則是由於私鑰取值不連續帶來的與HD錢包整合時的困難. 本次我們關注 EdDSA 簽名機制的原理以及 Ed25519 的實測速度

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;