Cryptography

壓縮的公鑰字節頭

  • May 8, 2020

我注意到壓縮的公鑰總是 0x02 或 0x03,但究竟是什麼決定了它是 0x02 還是 0x03?我可以查看 OpenSSL 程式碼來回答這個問題,但我希望有人已經知道答案並可以告訴我:P

OpenSSL 和比特幣使用的公鑰格式在SEP 1中進行了描述,該標準由有效密碼學標準組在第 10 頁發布。

  1. 使用第 2.3.5 節中指定的轉換常式 將欄位元素 x P轉換為長度為 ceil([log 2 q]/8) 個八位字節的八位字節字元串 X。
  2. 從 y P導出單個位 ȳ P,如下所示(這允許使用單個位緊湊地表示 y 座標):
  3. 如果 q = p 是奇素數,則設 ȳ P = y P mod 2。
  4. 如果 q = 2m,設置 ȳ P = 0 如果 x P = 0,否則計算 z = z m-1 x m-1 + · · · + z 1 x + z 0使得 z = y P x P並設置 ȳ P = z 0。
  5. 如果 ȳ P = 0,則將值 02 16分配給單個八位字節 Y,如果 ȳ P = 1 ,則將值 03 16分配給單個八位字節 Y。
  6. 輸出 M = Y || X。

…和第 53 頁 …

  • 如果 C 是一個八位字節串並且 C 的最左邊八位位組是 02 16或 03 16,則將 C 的最左側 ceil([log 2 q]/8)+1 個八位位組解析為八位位組字元串 R,C 的最右側maclen八位位組解析為一個八位字節串 D,C 的剩餘八位位組作為一個八位字節串EM
  • 如果 C 的最左邊八位字節是 04 16,則將 C 的最左邊的 2 * ceil([log 2 q]/8) + 1 個八位字節解析為八位字節串 R,將 C 的最右邊maclen八位字節解析為八位字節串 D,然後C 的剩餘八位字節作為八位字節字元串EM
  • 如果 C 的最左邊八位字節不是 02 16、 03 16或 04 16,則輸出“invalid”並停止。

所以,用簡單的英語:

  • 它也可以是 0x04。那是“未壓縮”的密鑰。如果您今天生成密鑰,它不會創建其中之一。但是,如果你有一個舊錢包,你可能會有一些。它們在安全性上等同於壓縮密鑰。
  • 是 0x02 還是 0x03 取決於 ȳ P的值。我們可以生成 ȳ P而不是包含完整的 y 座標,這為我們節省了很多空間。這就是壓縮密鑰。

我不確定 q 在這種情況下是什麼,如果有人想在評論中告訴我,將不勝感激。

奇偶校驗決定它是 0x02 還是 0x03

節點.JS:

if (y.isEven()) {
   publicKeyBytesCompressed.unshift(0x02)
} else {
   publicKeyBytesCompressed.unshift(0x03)
}

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