Transactions

比特幣如何從 Y 中獲取 X 值

  • April 5, 2020

如何從 Y 中獲取 X 值?

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

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

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