當使用帶有 Ed25519 和 Ed448 的 Ristretto 或 Decaf 時,標量是否仍需要修剪/修剪/夾緊?
Decaf 是一種點壓縮方法,它使用輔因子為(扭曲的)愛德華茲曲線和蒙哥馬利曲線建構素數階群 $ h = 4 $ 基於雅可比四次
$$ H2015 $$. 承諾是在僅對從 Decaf 解碼的點進行操作時消除輔因子。Ristretto 然後將這種方法擴展到帶有輔因子的曲線 $ h = 8 $ $$ HVLA20 $$. 但是,我仍然不清楚在使用帶有 Curve25519/Ed25519 的 ristretto255 時標量是否仍需要箝位。夾緊做了三件事:
- 它清除第一個字節的低三位,即與基點相乘的標量的低三位 $ B $ . 這大概是為了清除輔因子。但是,我不清楚$$ H2015 $$和$$ HVLA20 $$標量乘法是否需要首先清除輔因子,或者在素數組上具有低階分量的點是否是 Ristretto(和/或 Decaf)的“有效”輸入,或者我是否應該清除標量乘法的輔因子。實驗測試表明,具有低階組件的點可以正常互操作,但這對安全性意義不大。
- 它清除最後一個字節的最高位,即標量的第 255 位。這大概總是在有效標量的範圍內(因為 $ 8\ell $ = 0x80000000000000000000000000000000a6f7cef517bce6b2c09318d2e7ae9f68 用於曲線 25519)。
- 它設置最後一個字節的第 6 位,即設置標量的第 254 位(這樣標量總是至少 $ 2^{254} $ )。通過去$$ BJLS2015 $$,這是為了阻止袋鼠攻擊。然而,$$ BL2013.Twist $$注意到可以通過拒絕任何點來阻止袋鼠攻擊 $ P $ 為此 $ hQ = 0 $ 成立(但實現可能會忘記它,這可能是包含在 Ed25519/Curve25519 中的原因),或者有輔因子 $ h = 1 $ ,即順序為素數。
據我所知,假設 Ristretto(和 Decaf)創建素數階群並且基點在素數階群上,任何標量乘法都不需要這些位旋轉。然而,儘管如此,使用 Decaf/Ristretto 的 Ed448-Goldilocks 程式碼僅使用註釋即可完成完整的箝位過程
/* Blarg */
:https ://sourceforge.net/p/ed448goldilocks/code/ci/master/tree/src/per_curve/ eddsa.tmpl.c#l36(請注意,根據HISTORY.txt
,它使用 Ristretto,儘管有decaf
函式名稱)可能是這種情況,因為在
$$ H2015 $$,它重新引入了一個輔因子 $ h=2 $ ,順勢而為。然而,即便如此,我也看不出有理由用完整的輔因子來箝制 $ h=4 $ 或者 $ h=8 $ . 因此我的問題是:對於 Ed25519 和 Ed448,我是否需要使用 Ristretto 和/或 Decaf 執行完整的夾緊程序,是否可以完全跳過,是否只需要執行部分操作,還是需要完全不同的程序?
實施概述
我也去搜尋了 Ristretto 的其他實現。
- 轉到 github.com/gtank/ristretto255:
scalar/scalar.go
減少模 Edwards25519 $ \ell $ . 不透明的查找表使得很難看到之後實際發生了什麼。- Rust curve25519-dalek:
Scalar
類型減少標量模 Edwards25519 $ \ell $ 在標量乘法之前,請參見各個子目錄中的scalar.rs
和。constants.rs
不透明的查找表使得很難看到之後實際發生了什麼。- C libsodium:
core_ristretto255.c
生成與 Ed25519 相同的隨機標量core_ed25519.c
(清除最高位,但既不設置高位也不清除低位),選擇標量 $ S $ 候選人(在截斷前三位之後*,毫無疑問要嘗試使其低於 Edwards25519 $ \ell $ ) 如果它在範圍內 $ 0 < S < \ell $ .crypto_scalarmult_ristretto255_base()
並crypto_scalarmult_ristretto255()
在scalarmult_ristretto255_ref10.c
清除最高位,但不要設置高位,不要清除低位。然後,該標量立即用於標量乘法,無需箝位*。- JavaScript ristretto255-js:不做任何箝制。
getRandomScalar()
剪輯最高位,否則只檢查標量候選 $ S $ 為了 $ 0 \le S < \ell $ . 在將其傳遞給 tweetnacl-js scalarmult 之前,既不設置高位scalarMult()
也不scalarMultBase()
清除低位,它確實執行箝位crypto_scalarmult
(並且顯然在蒙哥馬利空間中執行?)。它有測試向量來測試curve25519-dalek。- WebAssembly/TypeScript wasm-crypto:使其意圖非常明確。和之間的唯一區別是前者在進行標量乘法之前呼叫。
_signEdKeypairFromSeed()``_signKeypairFromSeed``scClamp()
結果仍然沒有定論,但似乎強烈暗示不要箝制。但是,這只是基於人們如何實現它的啟發式方法,而不是實際正確的方法,因此不是任何類型的規範答案。
參考
BJLS2015: Daniel J. Bernstein、Simon Joseffson、Tanja Lange、Peter Schwabe、Bo-Yin Yang。更多曲線的 EdDSA,https: //ed25519.cr.yp.to/eddsa-20150704.pdf
BL2013.Twist:丹尼爾·J·伯恩斯坦、Tanja Lange。SafeCurves:為橢圓曲線加密選擇安全曲線:Twist security,https ://safecurves.cr.yp.to/twist.html
H2015:邁克·漢堡。Decaf:通過點壓縮消除輔因子,https ://www.shiftleft.org/papers/decaf/decaf.pdf
HVLA2020:Mike Hamburg、Henry de Valence、Isis Lovecruft、Tony Arcieri 等人。Ristretto 集團,https ://ristretto.group/ristretto.html
答案包含在 Decaf 論文中
$$ H2015 $$,頁。3已經。 清除最高位。這似乎只是為了獲得標量值 $ s $ 在範圍內 $ 0 \le s < \ell $ (在清除最高位後,額外檢查它是否真的成立)。這只是一個與實際加密數學混合的實現細節;請參閱問題中的實施概述。清除最高位是最大化找到標量的機會的選項 $ s < \ell $ , 但是在更大的範圍內選擇一些東西然後減少模數也是如此 $ \ell $ (例如 EdDSA 作為密鑰生成的一部分)。
設置高位。袋鼠攻擊比 rho 攻擊更有效 $ h > 1 $ 並且可以通過拒絕任何點來停止 $ Q $ 為此 $ hQ = 0 $
$$ BL2013.Twist $$. 然而,$$ H2015 $$注意到具有低階分量的點( $ P+T $ , 在哪裡 $ T $ 是一個低階點)可能出現在內部,但被認為等於那些沒有( $ P $ ) 並編碼為相同的值。編碼時,具有低階分量的點被“捕捉”到素數階子組的下一個元素,並且在解碼期間不允許它們。因此,使用 Decaf 從這樣的值解碼總是會拒絕 $ hQ = 0 $ . 因此不需要設置高位。輔因子問題在點編碼和解碼層處理。$$ H2014 $$ 清除低位。這是為了清除輔因子。不需要清除輔因子,因為低階分量在編碼期間被正規化
$$ H2015 $$$$ H2014 $$. 讓我們避免設置高位的相同原因因此也讓我們避免清除低位。 Ristretto 並沒有改變這個總體構想,它只是 Decaf 對輔因子的擴展 $ h=8 $ [ HVLA2020 ]。
結論:如果程式碼從以下統一選擇一個標量,那麼對於 Decaf 和 Ristretto 來說,位旋轉是完全可選的 $ 0 \le s < \ell $ . 清除最高位只是最大化找到標量的機會的一種選擇 $ s < \ell $ 在隨機選擇一個時。
H2014:https ://moderncrypto.org/mail-archive/curves/2014/000345.html