用 Ristretto255 替換 Curve25519
引用*PHP 社區的 Ristretto255*,
Ristretto255 是在 Curve25519 上定義的 Ristretto,它允許密碼學家擴展 Ed25519 簽名方案以支持複雜的零知識證明協議,而無需處理輔因子。
(Ed25519 中的輔助因素是導致CryptoNote 加密貨幣(nb Monero)中的多重支出漏洞的原因。)
我並不完全清楚,從這點來看,將 Curve25519 換成 Ristretto255 會涉及什麼。
crypto_scalarmult_ristretto255是crypto_scalarmult的替代品嗎?
有crypto_box_easy 和 crypto_box_easy_open,但他們使用 X25519 - 而不是 Ristretto255。我沒有看到
crypto_box_easy_ristretto255
功能。也許該特定案例不需要它?或者也許 libsodium 有這樣的功能,而我在查看文件時錯過了它?
Monero 漏洞與“關鍵圖像”有關。在簽署交易以花費輸出時,作為簽名的結果,會產生一個稱為“密鑰圖像”的唯一 EC 點。此密鑰圖像唯一地標識正在使用的輸出的私鑰(不顯示私鑰與環中的哪個輸出相關聯)。因此,如果花費者試圖在另一個環簽名中再次花費該輸出,他們將被迫再次聲明相同的密鑰圖像,並且網路將能夠看到已經有雙重花費嘗試。
但是,因為 Ed25519(和 Curve25519)有一個輔因子,所以有 8 個大子組(因為輔因子是 8)。這意味著您可以花費一個輸出,將關鍵圖像輕推到錯誤的子組中,並在某些情況下假裝第二個簽名具有不同的關鍵圖像。
解決這個問題非常簡單——您只需要驗證每個關鍵圖像以確保它位於正確的大型子組中。為此,您只需將其乘以組順序並檢查結果是否為無窮大點(“零”點)。
因此,如果您正在設計新的 EC 方案,Ristretto255 將有助於避免忘記在所有必要位置驗證點的風險。
X25519 的設計者很清楚這個問題,這就是為什麼 X25519 在密鑰交換過程中會清除私鑰的低 3 位。這強制私鑰是 8 的倍數,這意味著 X25519 的結果將在正確的大子組中,即使它在錯誤的大子組中提供了無效的 EC 點。
底線是 X25519 已經被設計用來防止 Ristretto255 被設計用來防止的問題。由於 X25519 已針對漏洞進行了非常廣泛的檢查,因此通過在 Ristretto255 中實施新形式的 ECDH 引入漏洞的風險將高於僅使用廣泛使用且經過審核的 X25519 實施的風險。
crypto_scalarmult_ristretto255 是 crypto_scalarmult 的替代品嗎?
Ristretto255 不應該與 Curve25519 互操作。它應該為您提供安全、等效的方法,同時向您隱藏實現細節並確保所有安全檢查到位。因此,如果您通常將 crypto_scalarmult 用於您自己的 ECDH 機制(或其他 EC 方案),您現在將使用 crypto_scalarmult_ristretto255 代替。