Private-Key
可以將“未壓縮”比特幣私鑰轉換為壓縮私鑰的 Javascript 庫或程式碼
我分叉了一個非常古老的大腦錢包生成器:https : //dvdbng.github.io/memwallet/——目前它生成未壓縮的比特幣私鑰。是否有可以將未壓縮的比特幣私鑰轉換為壓縮的 javascript 庫?或者為了壓縮比特幣私鑰需要了解哪些基礎知識?
更新:
哎呀抱歉我讀了“公鑰”。私鑰可以轉換為在未壓縮時壓縮的公鑰,但原始 EC 私鑰始終為 32 字節。該網站似乎正在生成所謂的錢包輸入格式 (WIF),用於在軟體應用程序之間傳輸私鑰。要轉換為十六進制:
- 使用 Base58Check 解碼
- 刪除第一個字節
- 如果 WIF 以 K 或 L 開頭,則還刪除最後一個字節 (0x01),它表示私鑰對應於壓縮的公鑰
例子:
無線上網:
5J2zgrqrMFcnWALe5foVPzaA8VLNJV8zoZn37WfQCu8DYDCVmXE
- Base58Check 解碼:
801cdb52e9a9fa3e089c7b8713218df4a7924b2109b159df480960ddfe73e221c3
- 刪除第一個字節:
1cdb52e9a9fa3e089c7b8713218df4a7924b2109b159df480960ddfe73e221c3
- 不適用
舊:
給定一個公鑰,例如
04a097026e876544a0e40f9ca836435560af4470e161bf60c23465dcb3151c947d1cbe052875211972107e25fca8dd939f1c6e749a43862673ec5cf7a8567f2d95
將其
0x04
指定為未壓縮的公鑰,其中接下來的 32 個字節是x
值,最後 32 個字節是y
橢圓曲線上點的值。要將未壓縮的公鑰轉換為壓縮的公鑰,您可以省略該
y
值,因為y
可以使用橢圓曲線方程求解該值:y² = x³ + 7
,給定x
。由於方程求解y²
,y
可以是正數或負數。因此,0x02
前面是正值y
,0x03
前面是負值。如果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'