STARK 曲線是安全曲線嗎?
SafeCurves定義了在橢圓曲線密碼學中選擇安全曲線的標準。
STARK 曲線定義了可與 ECDSA 一起使用的 Stark 友好型橢圓曲線。
我想知道:STARK 曲線是安全曲線嗎?
STARK 曲線似乎是 ECDSA 的合理選擇。
STARK 曲線定義在 $ \mathbb{F}_p $ 和 $ p = 2^{251} + 17*2^{192} +1 $ 用簡短的 Weierstrass 方程
$$ y^2 = x^3 + A x + B $$
和
$ A = 1 $ , 和
$ B = 3141592653589793238462643383279502884197169399375105820974944592307816406665 $
曲線組的順序(點數)是 $ n = #E(\mathbf{F}_p ) $ 是 $ n= 3618502788666131213697322783095070105526743751716087489154079457884512865583 $
這是一個素數指示
- 除身份以外的所有元素 ( $ \mathcal{O}) $ 可以是發電機。這條曲線的無袖數字(感謝 Aria 的指點)來自 $ \pi $ .
所以斯塔克斯至少現在有點僵硬。
最後,我袖子裡什麼都沒有的數字是相當生理的。
- 輔因子是 $ h=1 $ 這意味著曲線沒有蒙哥馬利表示,因此,沒有快速的蒙哥馬利階梯(需要 2 階元素,即 2|co-factor),Joyce 階梯仍然可能具有較慢的性能。在 ECDSA 中,這有助於計算 $ [k]G $ 因為只有 $ x $ 使用座標。
- 無需考慮小群攻擊,儘管這對於 ECDSA 的合法使用者來說不是問題。如果使用者不合法,那麼他們可以像在Curv25519中那樣使用它來雙花硬幣,但 STARK 曲線並非如此。
- 曲線群同構於 $ \mathbb{Z_n} $
這 $ n $ 具有 252 位二進製表示,這意味著它有 $ 126 $ -針對最佳經典離散對數問題的位安全性。
曲線的大小沒有碰撞 $ k $ 如果使用了一個好的隨機數生成器。如果仍然擔心這個可以使用rfc-6979中給出的確定性 ECDSA 。
Twist 安全性(與 ECDSA 無關);這條曲線的二次扭曲是$$ y^2 = x^3 + 5^2x +B5^3 $$ *
- 扭曲的基數=“618502788666131213697322783095070105623107215331596699973092056135872020481”
- 扭曲組的因子 =“499669 * 26023817775804638430931 * 278275836047110893120702478691334736277272165979”,這提供了大約 158 位的安全性。中等水平。
而且,我們有 $ 2*p+2 = Ord(E) + Ord(\text{E_quaratic_twist}) $
$ n \neq p $ 因此,它不是可以快速求解離散對數的異常曲線。
a = 1 b = 3141592653589793238462643383279502884197169399375105820974944592307816406665 p = 2^251 + 17*2^192 +1 E = EllipticCurve(GF(p), [0,0,0,a,b]) print(E) Et = E.quadratic_twist() print(Et) print("E abelian =", E.abelian_group()) print("E twist a = ", Et.abelian_group()) card = E.cardinality() cardEt = Et.cardinality() print("cardinality E =",card) print("cardinality E twist =",card) print("factors E ",factor(card)) print("factors Et ",factor(cardEt)) #Generator part not for the quadratic twist. #G = E(874739451078007766457464989774322083649278607533249481151382481072868806602,152666792071518830868575557812948353041420400780739481342941381225525861407) #n = G.order() #print("Generator order =", n) print(log(card,2).n()+1) assert(2*p+2 == card + cardEt)
*使用 QNR 5 形成的二次扭曲,不幸的是,它沒有按預期工作。感謝 Poncho 指出這一點。我保留了方程式,以便人們可以看到問題。相反,我使用
quadratic_twist
了相當慢的 SageMath 函式。