Elliptic-Curves
如何從壓縮形式擴展橢圓曲線公鑰?
在此頁面https://en.bitcoin.it/wiki/Secp256k1之後,secp256k1 曲線的方程為 $$ y^2=x^3+7 $$ 這是否意味著我可以替代 $ G_x $ 在等式中得到 $ G_y $ ? 我認為是的,這就是公鑰壓縮的工作原理,因為我們實際上不需要儲存 $ y $ 值,因為我們可以在執行時計算它。但是在替換 secp256k1 的生成器點後,我得到了錯誤的等式: $$ G_x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 $$ $$ G_y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 $$ $$ G_y^2=G_x^3+7 $$ $$ 106736222501650227577219490950371…=1.66977061698153803977729810299616665e230 + 7 $$ 等式是錯誤的。我哪裡錯了?
在 ECC 中,所有基礎算術都在 $ \mathbb F_p $ . Secp256k1 使用了一個素數,所以 $ \mod p $ 對於這類操作來說已經足夠了。需要一個大整數庫來正確計算算術。這是來自 Sagemath 的範常式式碼
#secp256k1 p = Integer("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F") a = Integer("0x0000000000000000000000000000000000000000000000000000000000000000") b = Integer("0x0000000000000000000000000000000000000000000000000000000000000007") K = GF(p) E = EllipticCurve(K,[a,b]) Gx = Integer(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798) Gy = Integer(0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8) G = E(Gx, Gy) # Check the base point assert(Gy^2 % p == (Gx^3 + a * Gx + b) % p) #Sample public points with compressed 02 Compressed = "02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737" #Sample public points with compressed 03 #Compressed = "03b1e8e14e794c00c364daa5ff85258ac480a0e21e819e08d5a259553ed911cb15" print( "Given public key\n", Compressed) #lift to find point that has the given x coordinate P = E.lift_x(Integer("0x"+Compressed[2:])) #Determine the correct y-coordinate. if (Integer(P[1]) % 2) == 0: print("Using compression 02\n", P) else: Q = E(P[0],p-P[1]) print("Using compression 03\n", Q)
上面的程式碼驗證了基點(嗯,
G = E(Gx, Gy)
已經在 SageMath 上進行了驗證),並且有兩個範例公鑰來解決全點。請記住,
- 前綴
04
表示不壓縮- 前綴
02
表示壓縮 $ y $ 座標是偶數- 前綴
03
表示壓縮 $ y $ 座標是奇數上面的程式碼只處理 case
02
而03
不是04
.