Elliptic-Curves

如何從壓縮形式擴展橢圓曲線公鑰?

  • June 15, 2022

在此頁面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 $ 座標是奇數

上面的程式碼只處理 case0203不是04.

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