Security

ECDSA x,y 座標有效性驗證似乎不起作用

  • November 5, 2021

據稱,比特幣的 ECDSA 算法 secp256k1 使用了該等式

y ^ 2 = x ^ 3 + 7 mod P

來確定橢圓曲線上所稱點的有效性。利用 <http://web2.0calc.com/>

在驗證具有以下特性的公鑰 1 時:

x = 55066263022277343669578718895168534326250603453777594175500187360389116729240

y = 326705100207588169780830851305070431844712​​73380659243275938904335757337482424

我在該網頁上應用了 x ^ 3,然後添加了 7,然後是 mod P。然後我把它平方根得到了

180964706334543048141953325634608696715.426683454595872

哪個不是 y。我怎麼做錯了?我的結果表明該點不是曲線上的有效點,但每個人都知道它是。顯然我是錯的人。

編輯:我想進一步澄清這個問題。我的問題是,如何在只有 X 值的情況下實際確定(例如)Y 值。比特幣做到了,“比特幣地址實用程序”也做到了。當某人擁有一個壓縮鍵(僅包含 x 座標)時,他們也能夠獲得 y 座標。使用上述網頁計算器不起作用,其他人說它是“模組化根”。任何人都有 Python 2.7.7 程式碼可以做到這一點,或者有一種相對簡單的方式來解釋如何完成這整個事情?謝謝。

這個方程的純文字格式只有在你理解它背後的理論時才有意義。 y ^ 2 = x ^ 3 + 7 mod P意思是“使用定義為 P 的有限數域在這個方程中做所有的數學運算”。最好這樣寫(y^2 = x^3 +7) mod p

為了保持數學簡單,讓我們簡單地從另一側減去一側,看看它的計算結果是否為零。這讓我們避免了根源。這是使用 Python 互動式 shell 的程式碼,例如python來自命令提示符):

>&gt;&gt; x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
>&gt;&gt; y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
>&gt;&gt; p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
>&gt;&gt; (x**3 + 7 - y**2) % p
0

根據您的 X 值,您可以獲得 2 個可能的 Y 值。

y^2 == (Y * Y) == (-Y * -Y)    (mod p)

根據比特幣交易輸入中公鑰的格式,您可以確定要驗證的 Y 是哪個。

如果公鑰以 04 開頭,則 Y 已經存在於公鑰中,您無需進行任何計算即可找到 Y

如果公鑰以 02 開頭,那麼你想要的 Y 值是偶數。

如果公鑰以 03 開頭,那麼你想要的 Y 值是奇數。

使用您的 X 範例,

X = 55066263022277343669578718895168534326250603453777594175500187360389116729240

我計算可能的 Y 值是,

Y1 = 32670510020758816978083085130507043184471273380659243275938904335757337482424
Y2 = 83121579216557378445487899878180864668798711284981320763518679672151497189239

根據比特幣交易輸入中公鑰的格式選擇您的 Y。

Python程式碼,

p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
ysquared = ((x*x*x+7) % p)
print "ysquared= %s " % ysquared
y = pow(ysquared, (p+1)/4, p)
print "y1 = %s " % y
print "y2 = %s " % (y * -1 % p)

我更喜歡以十六進制格式查看我的數字,所以這裡是與十六進制相同的範例輸出。

X = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
Y1 = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
Y2 = 0xb7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777

Python程式碼,

p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
ysquared = ((x*x*x+7) % p)    
print "ysquared= %s " % hex(ysquared)    
y = pow(ysquared, (p+1)/4, p)
print "y1 = %s " % hex(y)
print "y2 = %s " % hex(y * -1 % p)

包含公鑰 X,Y1 (0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798) 的範例交易

<https://2xoin.com/tx/8e2c570498680261040ceffdd15e67dda6c00a885d1e5484f220125f3a5e2c56>

在撰寫本文時,沒有使用公鑰 X,Y2 的交易

引用自:https://bitcoin.stackexchange.com/questions/32634