為什麼 Curve25519 用於加密,而 Ed25519 用於簽名?
NaCl 和 libsodium 庫使用 Curve25519 進行身份驗證加密(實際上用於共享用於加密的密鑰)和 Ed25519 進行簽名。對這些操作使用不同的原語的目的是什麼?為什麼不對密鑰共享和簽名使用相同的原語?
是否有一些安全或性能方面的考慮?但是密鑰共享和簽名都依賴於曲線點乘以標量,所以我想你不能通過使用不同的曲線在這裡獲得任何東西。如果其中一條曲線更快,則在兩種情況下都應該更快。
雖然橢圓曲線 Diffie Hellman (ECDH)、橢圓曲線簽名生成 (ECDSA) 和橢圓曲線簽名驗證確實依賴於標量乘法,但出於安全和效率的原因,它們通常被實現為不同類型的標量乘法。
事實上,這些方案在實踐中使用了三種類型的標量乘法:
- Fixed-Base:當標量乘法的輸入點在設計時已知時
- Variable-Base:當標量乘法的輸入點事先不知道時
- 雙基:當協議實際需要計算兩個標量乘法然後將兩個結果相加時。(例如 $ kP+rB $ )
可變基是 ECDH 中通常需要的,因為您從另一個對等方接收標量乘法的輸入點。
Fixed-Base用於密鑰生成和簽名生成。這裡的固定基始終是“生成點”,它是生成與曲線方程一起提供的素數階子群的點。
雙基用於簽名驗證(ECDSA 和 EdDSA 和 Schnorr)需要計算一些形式 $ kP+rB $ . 請注意,與 ECDH 或簽名生成不同,簽名驗證不使用任何秘密值,因此不需要恆定時間執行。
X25519 提供了一種非常簡單的、恆定時間的、快速的可變基標量乘法算法。這對 ECDH 非常有用,這就是它專門用於 ECDH 的原因。
Ed25519 提供了非常快速的固定基數和雙基數標量乘法,這要歸功於快速且完整的扭曲 Edwards 加法定律。事實上,Ed25519 的定基算法在大多數平台上都比 X25519 的變基算法快。
並且使用 X25519 進行簽名驗證只是一個壞主意,因為您需要執行兩次(計算 $ kP $ 和 $ rB $ ) 然後添加一個新函式來執行兩個結果點的完全相加。此外,您正在使用不需要的恆定時間計算。相反,您可以使用交錯的 NAF 方法和扭曲的 Edwards 加法定律實現更快的實現。
注意:出於此答案的目的,我沒有區分不同的橢圓曲線簽名算法,例如 ECDSA 和 EdDSA。
舊術語令人困惑,所以他們重新命名了一點。
- X25519 是 Curve25519 上的橢圓曲線 Diffie-Hellman (ECDH)
- Ed25519 是 Curve25519 上的 Edwards 曲線數字簽名算法 (EdDSA)
Libsodium 的 ref10 curve25519 程式碼實際上被
crypto_scalarmult()
/crypto_box()
和crypto_sign()
.