Private-Key

可以將“未壓縮”比特幣私鑰轉換為壓縮私鑰的 Javascript 庫或程式碼

  • July 27, 2019

我分叉了一個非常古老的大腦錢包生成器:https : //dvdbng.github.io/memwallet/——目前它生成未壓縮的比特幣私鑰。是否有可以將未壓縮的比特幣私鑰轉換為壓縮的 javascript 庫?或者為了壓縮比特幣私鑰需要了解哪些基礎知識?

更新

哎呀抱歉我讀了“公鑰”。私鑰可以轉換為在未壓縮時壓縮的公鑰,但原始 EC 私鑰始終為 32 字節。該網站似乎正在生成所謂的錢包輸入格式 (WIF),用於在軟體應用程序之間傳輸私鑰。要轉換為十六進制:

  1. 使用 Base58Check 解碼
  2. 刪除第一個字節
  3. 如果 WIF 以 K 或 L 開頭,則還刪除最後一個字節 (0x01),它表示私鑰對應於壓縮的公鑰

例子:

無線上網:5J2zgrqrMFcnWALe5foVPzaA8VLNJV8zoZn37WfQCu8DYDCVmXE

  1. Base58Check 解碼:801cdb52e9a9fa3e089c7b8713218df4a7924b2109b159df480960ddfe73e221c3
  2. 刪除第一個字節: 1cdb52e9a9fa3e089c7b8713218df4a7924b2109b159df480960ddfe73e221c3
  3. 不適用

給定一個公鑰,例如

04a097026e876544a0e40f9ca836435560af4470e161bf60c23465dcb3151c947d1cbe052875211972107e25fca8dd939f1c6e749a43862673ec5cf7a8567f2d95

將其0x04指定為未壓縮的公鑰,其中接下來的 32 個字節是x值,最後 32 個字節是y橢圓曲線上點的值。

要將未壓縮的公鑰轉換為壓縮的公鑰,您可以省略該y值,因為y可以使用橢圓曲線方程求解該值:y² = x³ + 7,給定x。由於方程求解,y可以是正數或負數。因此,0x02前面是正值y0x03前面是負值。如果y座標是偶數,那麼它對應於一個正數。如果奇數,則為負數。由於 y 值以 結尾0xee,它是偶數,因此是正數,公鑰的壓縮版本變為:

03a097026e876544a0e40f9ca836435560af4470e161bf60c23465dcb3151c947d

Javascript

您可以使用bitcoinjs-lib轉換:

const bitcoin = require('bitcoinjs-lib')

const pubkeyBuf = Buffer.from('04a097026e876544a0e40f9ca836435560af4470e161bf60c23465dcb3151c947d1cbe052875211972107e25fca8dd939f1c6e749a43862673ec5cf7a8567f2d95', 'hex')
const pubkey = bitcoin.ECPair.fromPublicKey(pubkeyBuf)
pubkey.publicKey.toString('hex')

'03a097026e876544a0e40f9ca836435560af4470e161bf60c23465dcb3151c947d'

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