Elliptic-Curves

STARK 曲線是安全曲線嗎?

  • January 15, 2022

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 函式。

引用自:https://crypto.stackexchange.com/questions/98124