比特幣如何從 Y 中獲取 X 值
如何從 Y 中獲取 X 值?
X = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
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) Output Y1 = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 Y2 = 0xb7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777 print hex((x**3 + 7 - y1**2) % p) // output 0 print hex((x**3 + 7 - y2**2) % p) // output 0
上面的 python 程式碼從 x 獲取兩個可能的 y 值
就像如何從 y 中獲取可能的 x 值一樣?
是否有任何可用的公式或腳本
我的問題是如何從 y 中獲取 x 值
如果 y 值
Y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
y 值以上如何獲得 x 值
我在BitcoinTalk上發布了這個答案,但會在這裡複製給那些不想追逐連結的人。以下是該連結的直接粘貼:
如果可以的話,安裝 sage 並使用它而不是 Python 會讓你的生活更輕鬆。bitcoin.ninja 上有一個範例筆記本,它在比特幣的曲線上做了一些 ECDSA 工作。
為了直接回答您的問題,我們可以從 y 中獲取 x,其方式與從 x 中獲取 y 的方式基本相同。要了解這一點,讓我們來看看您的方法為何有效。
我們從曲線方程中得到 Y = y^2 = x^3 + 7。您可以從 x 輕鬆計算 Y,然後為 y 求解 Y = y^2。根據費馬小定理,我們可以寫出 1 = y^(p - 1) = Y^(p - 1)/2。寫 Q = (p - 1)/2; 那麼我們有 Y^Q = 1,所以 Y^(Q + 1) = Y = y^2,所以 Y^((Q + 1)/2) = y。事實證明,(Q + 1)/2 = (p + 1)/4,這就是為什麼您能夠使用 (p + 1)/4 的指數來求解 y。請注意,這主要取決於 p 是 3 mod 4;否則 (p + 1)/4 將不是整數,我們將無法計算它。幸運的是,我們對 p 的選擇滿足了這一點。
好的!所以讓我們對 x 做類似的事情。讓我們寫 X = x^3 = y^2 - 7。X 可以很容易地從 y 計算出來,所以我們需要解決 X = x^3。寫 Q = (p - 1)/3; 那麼 X^Q = x^(p - 1) = 1,所以 X^(Q + 1) = Q = x^3,所以 X^((Q + 1)/3) = x。事實證明,(Q + 1)/3 = (p + 2)/9。這一次我們關鍵地依賴於 p 是 7 mod 9,以便它是一個整數。幸運的是!所以你去。
TL;DR 使用 (p + 2)/9 代替 (p + 1)/4。
哦,為了得到另外兩個立方根,你乘以一個非平凡的立方根 1。(類似於你在原始程式碼中乘以 -1。)一個這樣的立方根是 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee。
這是與您的類似的 Python 程式碼。它採用您的輸出 y 值之一併將輸入 x 值返回為 x2。
## Input y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 ## Field parameters # Field modulus p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f # Cube root of 1 beta = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee ## Actual code xcubed = (y*y - 7) % p print "xcubed = 0x%x" % xcubed x = pow(xcubed, (p + 2) / 9, p) print "x1 = 0x%x" % x print "x2 = 0x%x" % (x * beta % p) print "x3 = 0x%x" % (x * beta * beta % p)
它的輸出是
xcubed = 0x4866d6a5ab41ab2c6bcc57ccd3735da5f16f80a548e5e20a44e4e9b8118c26eb x1 = 0xc994b69768832bcbff5e9ab39ae8d1d3763bbf1e531bed98fe51de5ee84f50fb x2 = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 x3 = 0xbcace2e99da01887ab0102b696902325872844067f15e98da7bba04400b88fcb