Ed25519 使用了扭曲愛德華曲線,簽名過程和之前介紹過的 Schnorr,secp256k1, sm2 都不一樣,最大的區別在於沒有使用隨機數,這樣產生的簽名結果是確定性的,即每次對同一消息簽名結果相同。
一般說來隨機數是安全措施中重要的一種方法,但是隨機數的產生也是安全隱患,著名的索尼公司產品 PS3 密鑰泄露事件,就是隨機數產生的問題導致的。如果你對之前紹過的 Schnorr,secp256k1,sm2 等簽名過程比較熟的的話,就容易理解如果在簽名過程中出現了這個相同的隨機數 r,那麼私鑰將很容易被計算出來,造成泄露。
Why EdDSA ?
爲什麼要有愛德華簽名機制?
這就要從其發展歷史來看,從前幾篇的介紹,我們可以知道,愛德華曲線族的研究比較晚,在愛德華數字簽名體制出現之前,已經有了橢圓曲線簽名 EcDSA 機制,基於 Weierstrass 曲線, 代表性的是 secp256r1 和 secp256k1,前者就是 NIST P256 橢圓曲線算法。
如同任何事物都是不斷髮展向前的, 基於橢圓曲線的數字簽名亦是如此。EdDSA 旨在克服傳統的 EcDSA 的一些不足而誕生。
那麼 EcDSA 有哪些不足呢?主要如下:
簽名過程中不安全的使用隨機數【包括安全的隨機數發生器實現的困難性與程序員正確使用隨機數的困難性】,可能導致密鑰泄露
ECDSA 簽名的可鍛造性,參考此篇
簽名僞造:如果不需要提供簽名消息, 可以根據已有簽名值僞造對應私鑰的簽名值
當然效率上的提升是公共點,不單獨列出, 關於第三點很有意思,“澳本聰”就曾經利用“僞造‘的簽名來冒充”中本聰“,詳細的過程下一節在說。
好了, EdDSA 是爲改進這些不足和提高效率而產生。
關於 Edwards 曲線和 Weierstrass 曲線的發展,下面一組圖很生動形象:
在這裏插入圖片描述
圖一:兩種曲線原始形狀
在這裏插入圖片描述
圖二:形狀類比海星和烏龜
在這裏插入圖片描述
圖三:比賽賽跑
07 年以後,愛德華曲線的研究取得快速發展,後來居上,但都是在學術界,真正的廣泛使用是在 13 年斯諾登事件以後。
EdDSA 簽名機制優點
實現上做了優化,可在多種計算平臺上都能達到較高的性能;
簽名過程中不需要唯一的隨機數,能夠避免隨機數引發的安全問題;
無分支和祕密數據索引操作,對於側信道***等具有更好的免疫效果;
公鑰和簽名值都較小 (Ed25519 公鑰爲 32 個字節, 簽名值爲 64 字節),【注:這一點其實不明顯,和 secp256r1 和 secp256k1 一樣】
計算公式是完備 (Complete), 無需對不相信的點執行點的驗證操作;
抵抗碰撞, 弱哈希函數的碰撞不會破壞簽名機制 (PureEdDSA).
問題來了,既然 Ed25519 簽名比較優秀,比特幣爲什麼沒有采用?
因爲出現時間較晚!
後來的一些區塊鏈項目開始採用,包括 Stellar、Near Protocol 等。
小結
本文主要說了 EdDSA 簽名機制的發展及其優點,當然了也不是完美的,也有若干瑕疵,後續在說吧。
到此我們已經多次提到不安全的隨機的可能導致泄漏密鑰的問題, 具體是怎樣的呢?EcDSA 簽名機制的弱點,其中有一項就是可以一定程度是“僞造”簽名,通過簽名驗證。之所以說是一定程度,就代表不是真正意義上的簽名。
Ed25519使用了扭曲愛德華曲線,簽名過程和之前介紹過的Schnorr,secp256k1, sm2都不一樣,最大的區別在於沒有使用隨機數,這樣產生的簽名結果是確定性的,即每次對同一消息簽名結果相同。