Bitcoind

如何判斷一個公鑰點 y 是負數還是正數、奇數還是偶數?

  • November 14, 2021

取一個比特幣公鑰 (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我們可以了解私鑰的每一點klsb bit在密碼學中,我們稱之為硬核謂詞。正如我們所見,在 256 次呼叫之後,lsbPriv揭示了關鍵。所以lsbpriv很難恢復所有位。

這也意味著,如果lsbPriv存在這樣的函式,則等於解決Dlog曲線上的問題Secp256k。目前,我們知道這很難,所以沒有這樣的lsbPriv功能。

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