非对称加密, 助记词, PIN, WIF
一钱包
1.1非对称加密, 助记词, PIN, WIF, 地址
1.1.1 非对称加密算法
非对称加密算法, 加密与解密使用不同的KEY, 我们分别称为私钥与公钥,其中可以通过私钥生成公钥
在比特币中, 私钥本质上就是一个256位的随机整数。
ECPair, 是指通过椭圆曲线算法生成 钥匙对。
1.1.2 助记词
在以太坊,私钥为128位的随机数,非常难以记忆。 从而提出了助记词来帮助记忆私钥。
|128bit (16字节)|4 (checksum)|
具体方法为, 在128位后面追加4位校验码。 长度变为了132位,然后分成12段,每段11位值查表得到一个单, 共记12个助记词
1.1.3 PIN
助记词本身已经代表私钥了, 但是这种文字很容易以明文显示展示出来, 为了安全。 以太坊可以提供加入个人密码,称之为PIN。以一种盐的形式混入到私钥中, 形成另一个实际私钥。
这就可以形成keystore文件,该文件含有加密后的私钥, 需要PIN来解密使用
1.1.4 WIF (Wallet Import Format)
比特币钱包导入格式,比特币的私钥为256位。 为了使私钥看起来更简洁,使用两种方式对私钥进行编码:
非压缩的私钥格式: (已经不在使用了)
私钥如:3cf316e3261041028bbced0a8d6b9d06e874d27b3093fe428741ce4458b4d1f3
BASE58(| 1 (0x80)| 256bit(64字节) | 4 (checksum) |) 即,
其中,checksum为两次sha256
可以直接通过wif.encode(0x80, privatekey, fase)生成
结果以5开头,如5JH8TRekVnj86FaSZEumgA4LDxzUSmLTNe5VUPcCHX8Z4qT4QKA
压缩的私钥格式:(当下正在使用格式)
BASE58(| 1 (0x80)| 256bit(64字节) | 1(0x01) | 4 (checksum) |) 即,
其中,checksum为两次sha256
可以直接通过wif.encode(0x80, privatekey, true)生成
结果以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); // 导入私钥
// 计算公钥:
let pubKey = ecPair.getPublicKeyBuffer(); // 返回Buffer对象
console.log(pubKey.toString('hex')); // 02或03开头的压缩公钥
1.1.6 地址
比特币
特币的地址并不是公钥,而是公钥的哈希,即从公钥能推导出地址,但从地址不能反推公钥,因为哈希函数是单向函数。
Base58(|1 (0x00) | 20 (hash160) | 4 (check) |)
首先对1+32=33字节的公钥数据进行Hash160(即先计算SHA256,再计算RipeMD160),得到20字节的哈希。然后,添加
0x00前缀,得到1+20=21字节数据,再计算4字节校验码,拼在一起,总计得到1+20+4=25字节数据:address = ecPair.getAddress(); // 返回String地址
如1PwKkrF366RdTuYsS8KWEbGxfP4bikegcS
以太坊
地址是通过对公钥做Keccak-256哈希,然后取最后的40位16进制字符得到的。
如:0x24602722816b6cad0e143ce9fabf31f6026ec622
1.2 HD钱包
BIP39:以mnemonic+用户口令为种子,通过计算后最终得到的64字节钱包种子。
以太坊
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" // 这是用户自定义密码PIN
var 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" // 这是用户自定义密码PIN
var 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-lib
1.3.2 生成测试网地址
var bitcore = require('bitcore-lib');
var Networks = bitcore.Networks;
var PrivateKey = bitcore.PrivateKey;
// 设置成测试网络
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())
输出结果如下:
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 转账
用安装引用包
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()
// 目标地址的私钥为:99d3bb48b0b9b3493fce26b05c2302359b4a81b93606af1a149c5c2deb2bca6b
// 目标地址为: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)
}
});
}
});
如果有报告如下类似错误:
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
这个时候,就可以把这个交易编号拿https://live.blockcypher.com/btc-testnet/上面去查看了
非对称加密, 助记词, PIN, WIF的更多相关文章
- [转]HD钱包的助记词与密钥生成原理
本文转自:https://blog.csdn.net/opassf/article/details/79978047 区块链相关的话题持续发酵之时,应该不少人知道加密货币钱包,钱包是普通用户与加密货币 ...
- [转]简单科普私钥、地址、助记词、Keystore的区别
本文转自:https://www.jianshu.com/p/d0a4a44685d3 很多人保管不好自己的虚拟财产,发生丢币的情况,很多都是因为不清楚私钥的概念. 私钥(Private Key) 比 ...
- 1.16. BIP39协议:使用助记词生成确定性钱包
以太坊系统学习教程: https://www.netkiller.cn/blockchain/bip39.html 1.16. BIP39协议:使用助记词生成确定性钱包 BIP:39 层:应用层 标题 ...
- Bytomd 助记词恢复密钥体验指南
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 背景知识 ...
- [币严BIZZAN区块链]Java生成ETH钱包助记词、私钥、地址
本文主要介绍在Java工程中如何生成ETH钱包的助记词.私钥.地址. 一.在之前创建的spring boot 项目中的 pom.xml文件中加入需要的依赖 <dependency> < ...
- 以太坊 生成助记词和infuru插件
https://iancoleman.io/bip39/ https://infura.io google faucet : https://faucet.rinkeby.io/ 登录google账号 ...
- 【转载】非对称加密过程详解(基于RSA非对称加密算法实现)
1.非对称加密过程: 假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...
- 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理
http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc https://blog.csdn.net/ ...
- 非对称加密与OpenSSL
随着个人隐私越来越受重视, HTTPS也渐渐的流行起来, 甚至有许多网站都做到了全站HTTPS, 然而这种加密和信任机制也不断遭遇挑战,比如戴尔根证书携带私钥,Xboxlive证书私钥泻露, 还有前一 ...
随机推荐
- java 形式参数和实际参数的区别
1.形参不能离开方法.形参只有在方法内才会发生作用,也只有在方法中使用,不会在方法外可见.而实参可以再程序的任何地方都使用.
- [luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...
- XAMPP启动Apache时发生ERROR
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非常容易安装和 ...
- [record]WebLogic域之创建-文本界面
WebLogic域的创建方式主要有图形界面.文本方式(字符界面).脚本方式(WLST脚本)等,本文用文本方式来创建域. 一.启动Configuration Wizard •config.cmd/con ...
- cropper截图不压缩PHP上传裁剪后的图片
cropperjs使用不多说网上都有很详细的介绍如下面: https://blog.csdn.net/lxy4239/article/details/78920979 主要讲下使用的经历 裁剪后图片不 ...
- 使用eclipse新建一个c项目
一.打开eclipse并新建项目 1.快捷键:字体放大:Ctrl+Shift+“+” 字体缩小:Ctrl+“-”
- NFS, web,负载均衡,Nginx yum 源码安装
作业一:nginx服务1.二进制安装nginx 2.作为web服务修改配置文件 3.让配置生效,验证配置 [root@localhost ~]# systemctl stop firewalld.s ...
- Ubuntu中搭建强化学习平台(使用anaconda管理Python并安装tensorflow、opencv)
首先介绍一下anaconda,annoconda是一个开源的Python发行版本,里面集成了python.conda等多个科学包及其依赖项.安装完成之后,就可以使用conda版本管理器进行管理,可以让 ...
- 【js高程学习笔记】关于变量值和函数参数
变量包含了两种不同类型的值: 基本类型 (Undefined.null.Boolean.Number.string都属于基本类型) 引用类型 (对象) 两种值在赋值上不同的是: 将一个引用类型的值(对 ...
- Python之路【目录】
https://www.cnblogs.com/wupeiqi/articles/4938499.html