Wallet

什麼是私鑰格式?

  • October 18, 2020

我不知道私鑰格式,但是許多 stackoverflow 文章暗示了某種格式

私鑰格式

這是哪種私鑰格式?

Dumpprivkey 中的私鑰是什麼編碼或格式?

看看iancoleman/bip39 的網站,確實私鑰會隨著您更改硬幣而發生變化,這意味著至少有一種格式考慮到了版本字節。

但是,在 js 中使用hdkey我無法重現這種格式,甚至無法重現 Pieter Wuille 在上一個範例中描述的“32 字節 big-endian 秘密參數”。

var bip39 = require('bip39');
var hdkey = require('hdkey');    

const mnemonic = 'thunder purchase pave tower lecture upgrade supreme half kid fitness tray shove'
const seed = bip39.mnemonicToSeed(mnemonic); //creates seed buffer
console.log('mnemonic: ' + mnemonic);

const root = hdkey.fromMasterSeed(seed);
const masterPrivateKey = root.privateKey.toString('hex');

const addrnode = root.derive("m/0'/0");
console.log('addrnodePublicKey: '+ addrnode._publicKey.toString('hex'))
console.log('addernodePrivateKey: ' + addrnode._privateKey.toString('hex'))

詳細的私鑰格式是什麼?它由什麼組成,如何從標準私鑰派生出來?與未格式化的私鑰相比,它的用途是什麼?

您使用的格式取決於您需要如何使用私鑰。您的程式碼生成一個原始的十六進制私鑰,沒有格式化。

$ node index.js
mnemonic: thunder purchase pave tower lecture upgrade supreme half kid fitness tray shove
addrnodePublicKey: 02ceb48796223dc3777fe210a2034059b5e39b3743e59d62f75ef07a32f8440caf
addernodePrivateKey: 310fe2e677a3ad28acb91d2645bb33882f015ab11e59dce9d2a72905979e3cb6

原始私鑰

私鑰(在比特幣中,即ECDSA SECP256K1)是一個 32 字節的數字,介於0x1和之間0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140

例如:

0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

錢包輸入格式 (WIF)

但是,錢包軟體通常使用**錢包輸入格式 (WIF)**以使其更容易複製。它使用base58check編碼,因此它避免了模棱兩可的字元(如 0 和 O),它更短,並且在拼寫錯誤的情況下包含校驗和。例如:

5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

WIF 轉換

這裡概述了將原始私鑰轉換為 WIF 的過程:https ://en.bitcoin.it/wiki/Wallet_import_format :

  • 獲取私鑰

0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

  • 在它前面添加一個 0x80 字節用於主網地址或 0xef 用於測試網地址。如果私鑰對應於壓縮的公鑰,則還要在末尾添加一個 0x01 字節

800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

  • 對擴展密鑰執行 SHA-256 雜湊

8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592

  • 對 SHA-256 雜湊的結果執行 SHA-256 雜湊

507A5B8DFED0FC6FE8801743720CEDEC06AA5C6FCA72B07C49964492FB98A714

  • 取第二個 SHA-256 雜湊的前 4 個字節,這是校驗和

507A5B8D

  • 在第 2 點的擴展密鑰末尾添加第 5 點的 4 個校驗和字節

800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D507A5B8D

  • 使用 Base58Check 編碼將結果從字節字元串轉換為 base58 字元串。這是錢包導入格式

5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

潛在的 node.js 資源:

  • <https://github.com/bitcoinjs/bs58check>
  • <https://www.npmjs.com/package/create-hash>

我已經在某個地方回答了這個問題,但是再也找不到了……我也對不同的鍵感到困惑,並創建這個圖形了一個更清晰的畫面:

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