非对称加密, 助记词, PIN, WIF
一錢包
1.1非對稱加密, 助記詞, PIN, WIF, 地址
1.1.1 非對稱加密算法
非對稱加密算法, 加密與解密使用不同的KEY, 我們分別稱為私鑰與公鑰,其中可以通過私鑰生成公鑰
在比特幣中, 私鑰本質(zhì)上就是一個(gè)256位的隨機(jī)整數(shù)。
ECPair, 是指通過橢圓曲線算法生成 鑰匙對。
1.1.2 助記詞
在以太坊,私鑰為128位的隨機(jī)數(shù),非常難以記憶。 從而提出了助記詞來幫助記憶私鑰。
|128bit (16字節(jié))|4 (checksum)|
具體方法為, 在128位后面追加4位校驗(yàn)碼。 長度變?yōu)榱?32位,然后分成12段,每段11位值查表得到一個(gè)單, 共記12個(gè)助記詞
1.1.3 PIN
助記詞本身已經(jīng)代表私鑰了, 但是這種文字很容易以明文顯示展示出來, 為了安全。 以太坊可以提供加入個(gè)人密碼,稱之為PIN。以一種鹽的形式混入到私鑰中, 形成另一個(gè)實(shí)際私鑰。
這就可以形成keystore文件,該文件含有加密后的私鑰, 需要PIN來解密使用
1.1.4 WIF (Wallet Import Format)
比特幣錢包導(dǎo)入格式,比特幣的私鑰為256位。 為了使私鑰看起來更簡潔,使用兩種方式對私鑰進(jìn)行編碼:
非壓縮的私鑰格式: (已經(jīng)不在使用了)
私鑰如:3cf316e3261041028bbced0a8d6b9d06e874d27b3093fe428741ce4458b4d1f3
BASE58(| 1 (0x80)| 256bit(64字節(jié)) | 4 (checksum) |) 即,
其中,checksum為兩次sha256
可以直接通過wif.encode(0x80, privatekey, fase)生成
結(jié)果以5開頭,如5JH8TRekVnj86FaSZEumgA4LDxzUSmLTNe5VUPcCHX8Z4qT4QKA
壓縮的私鑰格式:(當(dāng)下正在使用格式)
BASE58(| 1 (0x80)| 256bit(64字節(jié)) | 1(0x01) | 4 (checksum) |) 即,
其中,checksum為兩次sha256
可以直接通過wif.encode(0x80, privatekey, true)生成
結(jié)果以K或L開頭,如KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88
bitcoinjs提供的ECPair總是使用壓縮格式的私鑰表示:
bitcoin = require('bitcoinjs-lib'), BigInteger = require('bigi'); d = BigInteger.fromBuffer(Buffer.from(privatekey, 'hex')), keyPair = new bitcoin.ECPair(d);1.1.5 公鑰
比特幣
const bitcoin = require('bitcoinjs-lib'); wif = 'KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88', ecPair = bitcoin.ECPair.fromWIF(wif); // 導(dǎo)入私鑰 // 計(jì)算公鑰: let pubKey = ecPair.getPublicKeyBuffer(); // 返回Buffer對象 console.log(pubKey.toString('hex')); // 02或03開頭的壓縮公鑰1.1.6 地址
比特幣
特幣的地址并不是公鑰,而是公鑰的哈希,即從公鑰能推導(dǎo)出地址,但從地址不能反推公鑰,因?yàn)楣:瘮?shù)是單向函數(shù)。
Base58(|1 (0x00) | 20 (hash160) | 4 (check) |)
首先對1+32=33字節(jié)的公鑰數(shù)據(jù)進(jìn)行Hash160(即先計(jì)算SHA256,再計(jì)算RipeMD160),得到20字節(jié)的哈希。然后,添加0x00前綴,得到1+20=21字節(jié)數(shù)據(jù),再計(jì)算4字節(jié)校驗(yàn)碼,拼在一起,總計(jì)得到1+20+4=25字節(jié)數(shù)據(jù):
address = ecPair.getAddress(); // 返回String地址
如1PwKkrF366RdTuYsS8KWEbGxfP4bikegcS
以太坊
地址是通過對公鑰做Keccak-256哈希,然后取最后的40位16進(jìn)制字符得到的。
如:0x24602722816b6cad0e143ce9fabf31f6026ec622
1.2 HD錢包
BIP39:以mnemonic+用戶口令為種子,通過計(jì)算后最終得到的64字節(jié)錢包種子。關(guān)于 bip 39? 提案協(xié)議:https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
以太坊
import Bip39 from 'bip39' import util from 'ethereumjs-util' import Wallet from 'ethereumjs-wallet' var HDKey = require('ethereumjs-wallet/hdkey') var _seed = Bip39.generateMnemonic(); console.log("助記詞:", _seed) var _pass = "123456" // 這是用戶自定義密碼PINvar seedKey = Bip39.mnemonicToSeed(_seed, _pass) var hdWallet = HDKey.fromMasterSeed(seedKey) var key = hdWallet.derivePath("m/44'/60'/0'/0/" + _index) var address = util.pubToAddress(key._hdkey._publicKey, true) console.log("私鑰:",key._hdkey._privateKey.toString('hex')) console.log("公鑰:",key._hdkey._publicKey.toString('hex')) console.log("地址:",address.toString('hex'))比特幣
var bitcoin = require('bitcoinjs-lib') var bip39 = require('bip39') var bip32 = require('bip32')var _seed = bip39.generateMnemonic(); console.log("助記詞:", _seed) var _pass = "123456" // 這是用戶自定義密碼PINvar seed = bip39.mnemonicToSeed(_seed, _pass) var root = bip32.fromSeed(seed) var child0 = root.derivePath("m/44'/0'/0'/0/"+ _index); console.log("私鑰",child0.privateKey.toString('hex')); console.log("公鑰",child0.publicKey.toString('hex'));var seedHex = bip39.mnemonicToSeedHex(_seed, _pass) var hroot = bitcoin.HDNode.fromSeedHex(seedHex) var hchild0 = hroot.derivePath("m/44'/0'/0'/0/" + _index); console.log("地址:",hchild0.getAddress())1.3 bitcore-lib 操作比特幣
1.3.1 安裝
npm i bitcore-lib1.3.2 生成測試網(wǎng)地址
var bitcore = require('bitcore-lib'); var Networks = bitcore.Networks; var PrivateKey = bitcore.PrivateKey; // 設(shè)置成測試網(wǎng)絡(luò) Networks.defaultNetwork = Networks.testnet; var testKey = PrivateKey.fromRandom(); console.log("private:", testKey.toString()); var pubKey = testKey.publicKey; console.log("public:", pubKey.toString()) var address = testKey.toAddress(); console.log('address:', address.toString())輸出結(jié)果如下:
console.log("private:", testKey.toString());
private: 2e61e120df72942abdb3c93fce15ef82b855b7a2f1270707feecb34ff8a7730e
undefined
var pubKey = testKey.publicKey;
undefined
console.log("public:", pubKey.toString())
public: 038e2ae27f98b1ff10d4ff658cc846f2260b86123fca26a5edf29a943681a4ab01
undefined
var address = testKey.toAddress();
undefined
console.log('address:', address.toString())
address: mwZogrFFZhb8GqTSm4C7WFfSCJKeVovo4k
對于livenet生成地址如:1KLJV3ocK7w6JXH2f2BdShy2jiuETpTo59
1.3.3 轉(zhuǎn)賬
用安裝引用包
npm install bitcore-explorers --save var Insight = require('bitcore-explorers').Insight; var insight = new Insight('testnet'); var bitcore = require('bitcore-lib');var Networks = bitcore.Networks; var PrivateKey = bitcore.PrivateKey; // 生成地址 var privateKey = PrivateKey('2e61e120df72942abdb3c93fce15ef82b855b7a2f1270707feecb34ff8a7730e', 'testnet'); var address = privateKey.toAddress()// 目標(biāo)地址的私鑰為:99d3bb48b0b9b3493fce26b05c2302359b4a81b93606af1a149c5c2deb2bca6b // 目標(biāo)地址為:mvWrzyVe1QMCcX3XrMEicXbt81Wd3Un35F var address2 = PrivateKey('99d3bb48b0b9b3493fce26b05c2302359b4a81b93606af1a149c5c2deb2bca6b', 'testnet').toAddress();insight.getUnspentUtxos(address, function(err,utxos){if(err){console.log(err);}else{console.log(utxos);var tx = bitcore.Transaction();tx.from(utxos);tx.to(address2, 100000);tx.change(address);tx.sign(privateKey);console.log("transaction:", tx.toObject());txs = tx.serialize();var scriptIn = bitcore.Script(tx.toObject().inputs[0].script);console.log('input script string:', scriptIn.toString());var scriptOut = bitcore.Script(tx.toObject().outputs[0].script);console.log("output script string:", scriptOut.toString());//tx.addData();insight.broadcast(txs, function(err, returnedTxId){if (err){console.log(err);}else{console.log('successful broadcast:' + returnedTxId)}}); } });如果有報(bào)告如下類似錯(cuò)誤:
at Object.bitcore.versionGuard (/home/u18/node_modules/bitcore-explorers/node_modules/bitcore-lib/index.js:12:11)
打開文件index.js
bitcore.versionGuard = function(version) {
改為:
bitcore.versionGuard = function(version) { return;
最終正確輸出如下:
successful broadcast:1eff85255798bd3a91935912ff8046dc2511902a7fbbd24cf971f59957a8fae4
這個(gè)時(shí)候,就可以把這個(gè)交易編號(hào)拿https://live.blockcypher.com/btc-testnet/上面去查看了
總結(jié)
以上是生活随笔為你收集整理的非对称加密, 助记词, PIN, WIF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习笔记系列之继承多态
- 下一篇: ASIO 腾空出世 (那些年我们追过的网