驗證一個點是否屬於 secp256r1
我需要驗證這個公鑰中的點
04 11 95 23 03 f0 f1 f1 45 67 14 98 e4 39 80 ce 25 39 02 6e 72 34 fe 02 38 8a ea cc fb 3a 3d 4d dc d9 6d 3c fe 8b 55 bf ea c3 3a a1 59 13 54 b3 91 79 45 b7 3b 49 d9 0e 96 2a de 79 d3 49 dc 79 ca
在 secp256r1 中。我已經知道參數 $ a $ 和 $ b $ 曲線,但它們非常大並且是十六進制的。我一直在嘗試將它傳遞到十進制,但我沒有得到它。我應該用十六進制計算嗎?我也不明白公鑰的座標是什麼。我的意思是,公鑰應該是一個具有 x 座標和 y 座標最不重要部分的點,因為公鑰從 04 開始,不是嗎?我真的很抱歉,但我對如何處理這個問題感到困惑。
注意:我看到一些問題與我的基本相同,但數字要小得多。我也有 PARI/GP 可以使用。
**編輯:**我嘗試使用 SageMath,結果是
y = 98344895439910594971593461997930184197459096557735598026509132013917697767882 a = 115792089210356248762697446949407573530086143415290314195533631308867097853948 b = 41058363725152142129326129780047268409114441015993725554835256314039467401291
然後,我嘗試
y^2 == x^3 + a*x + b
了,它給出了 False,但我事先知道該點屬於曲線。你能告訴我我做錯了什麼嗎?
在有限域上定義的橢圓曲線 $ \mathbb F_p $ 意味著所有座標都是 $ \mathbb F_p $ ,即在仿射座標中,讓 $ P=(x,y) $ 然後成為一個觀點 $ x,y \in \mathbb F_p $ . 實際上,所有的算術都完成了 $ \mathbb F_p $
在編碼中
04 11 95 23 03 f0 f1 f1 45 67 14 98 e4 39 80 ce 25 39 02 6e 72 34 fe 02 38 8a ea cc fb 3a 3d 4d dc d9 6d 3c fe 8b 55 bf ea c3 3a a1 59 13 54 b3 91 79 45 b7 3b 49 d9 0e 96 2a de 79 d3 49 dc 79 ca
第一個字節定義壓縮並
04
表示沒有壓縮。所以,去掉 後04
,前半部分屬於 $ x $ 下半場屬於 $ y $ 點的座標。你忘了拿 $ \bmod p $ .
通過測試雙方的平等
#Sagemath x = Integer("0x11952303f0f1f145671498e43980ce2539026e7234fe02388aeaccfb3a3d4ddc") y = Integer("0xd96d3cfe8b55bfeac33aa1591354b3917945b73b49d90e962ade79d349dc79ca") a = Integer("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC") b = Integer("0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B") p = Integer("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF") print(y^2 % p) print( (x^3 + a * x + b) % p ) #or test with assert assert(y^2 % p == (x^3 + a * x + b) % p)
輸出
107039974491263683037557989129009082794410266580376414531485756411379666775575 107039974491263683037557989129009082794410266580376414531485756411379666775575
因此它是曲線上的一個有效點。
在 SageMath 上使用曲線
還有另一種方法,在 SageMath 上可能更容易。此方法使用橢圓曲線構造和曲線上的定義點。
#secp256r1 a = Integer("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC") b = Integer("0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B") p = Integer("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF") K = GF(p) E = EllipticCurve(K,[a,b]) x = Integer("0x11952303f0f1f145671498e43980ce2539026e7234fe02388aeaccfb3a3d4ddc") y = Integer("0xd96d3cfe8b55bfeac33aa1591354b3917945b73b49d90e962ade79d349dc79ca") P = E(x,y) ### try to set the point with the coordinates.
如果 $ P $ 不是曲線上的一個點,你會得到很多錯誤
補充說明
在接下來的步驟中,您可能想要添加/加倍點。橢圓曲線使用特殊公式進行點加法。你可以在這裡找到它們,或者直接使用 Sagemath,你可以只使用加法來進行點加法
P+Q
和5*P
標量乘法,通常寫成 $ [5]P = P + P + P + P +P $無窮遠點的表示
橢圓曲線上的點和無窮遠點 $ \mathcal{O} $ 在點加法下形成一個阿貝爾群。對於 secp256r1;
$$ E(\mathbb{F_p}) := { (x, y) \in \mathbb{F}^2_p \mid y^2= x^3 + a\cdot x + b} \cup {\mathcal O} $$
正如我們所見, $ \mathcal O $ 在仿射座標上沒有表示,我們神奇地將它添加到組定義中。雖然在數學上我們可以處理這個問題,但我們需要通過程式來表示它。如果 $ b \neq 0 \bmod p $ 然後協調 $ (0,0) $ 不滿足曲線方程,因此它不在曲線上,因此它是表示 $ \mathcal O $ 並且通常選擇這種方式。在使用圖書館時,請始終檢查 $ \mathcal O $ 被代表。