如何判斷一個公鑰點 y 是負數還是正數、奇數還是偶數?
取一個比特幣公鑰 (x, y) 及其加法逆 (x, -y)。您如何確定哪個是積極點,哪個是消極點?
例子
私鑰 1 -> (x, y)
x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798L
y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8L
-y = 0xb7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777L
私鑰 2 -> (x, y)
x = 0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5L
y = 0x1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52aL
-y = 0xe51e970159c23cc65c3a7be6b99315110809cd9acd992f1edc9bce55af301705L
私鑰 3 -> (x, y)
x = 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9L
y = 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672L
-y=0xc77084f09cd217ebf01cc819d5c80ca99aff5666cb3ddce4934602897b4715bdL
此外,您如何辨識哪個 pub 鍵是奇數,哪個是偶數?
例如:私鑰 1 x,y 是奇數,私鑰 2 x,y 是偶數
沒有具體的決定可以使一個“y”值在 EC 點中為負或不為負。隨意制定自己的約定,例如 y 值 <= 小於 p 的一半是負數,而 > 一半 p 是正數。不過,這只是一個約定。
有關的:
此外,您如何辨識哪個 pub 鍵是奇數,哪個是偶數?
例如:私鑰 1 x,y 是奇數,私鑰 2 x,y 是偶數
你不能!並非不知道私鑰本身。如果可以,您將成為解決離散對數問題的一部分。
讓我們更正式地看一下這個。
假設有一個函式,它從作為基點的
lsbPriv(P)
公鑰返回私鑰的 LSB 。k``P = [k]G``G
現在,我們可以使用這個函式來確定私鑰的所有位,
k
如下所示;func DlogbyLSB(P) for i in range(1..256) x = lsbPriv(P) secretKey.append(x) if x == 0 then ; test the bit P = [2^-1]P ; i.e. we can divide `k` by `2` since the last bit is `0` else P = [1]G ; i.e. we substructed the bit `1` from the `k` and P = [2^-1]P ; now it is again divisible by `2` return secretKey
這幾乎與計算橢圓曲線上的標量乘法的加倍算法相反。
因此,在 的幫助下,
lsbPriv
我們可以了解私鑰的每一點k
。lsb bit
在密碼學中,我們稱之為硬核謂詞。正如我們所見,在 256 次呼叫之後,lsbPriv
揭示了關鍵。所以lsbpriv
很難恢復所有位。這也意味著,如果
lsbPriv
存在這樣的函式,則等於解決Dlog
曲線上的問題Secp256k
。目前,我們知道這很難,所以沒有這樣的lsbPriv
功能。