区块链的技术原理:
- 钱包助记词生成种子(Seed),种子生成私钥。私钥推导出公钥,公钥节选部分生成钱包地址。
- 同时钱包也提供了keystore,它也是私钥加密后的文件,可以配合正常的密码使用,便捷了用户的钱包使用。
生成助记词
私钥一般太难记忆,使用不方便,所以为简化操作同时保证安全,就出现了助记词的方法。一般情况下,助记词由一些单词组成,只要按照顺序输入,也能打开钱包。
规定熵的位数必须是 32 的整数倍,所以熵的长度取值位128 到 256 之间取 32 的整数倍的值,分别为 128, 160, 192, 224, 256;
校验和的长度为熵的长度/32 位, 所以校验和长度可为 4,5,6,7,8 位;
助记词库有 2048 个词,用 11 位可全部定位词库中所有的词,作为词的索引,故一个词用 11 位表示,助记词的个数可为 (熵+校验和)/11,值为 12,15,18,21,24
1. 生成一个长度为 128~256 位(bits)的随机序列(熵);
2. 取熵哈希后的前n位作为校验和(n= 熵长度/32);
3. 随机序列+校验和;
4. 把步骤3得到的结果每 11位切割;
5. 步骤4得到的每11位字节匹配词库的一个词;
6. 步骤5得到的结果就是助记词串;
通过助记词生成种子
助记词由长度为128 到 256 位的随机序列(熵)匹配词库而来,随后采用PBKDF2 function 推导出更长的种子(seed)。生成的种子被用来生成构建 deterministic Wallet 和推导钱包密钥。
在密码学中,Key stretching技术被用来增强弱密钥的安全性,增加了暴力破解 (Brute-force attack) 对每个可能密钥尝试攻破的时间,增强了攻击难度。各种编程语言原生库都提供了 key stretching 的实现。PBKDF2(Password-Based Key Derivation Function 2)是常用的 key stretching 算法中的一种。基本原理是通过一个为随机函数(例如HMAC 函数),把明文和盐值作为输入参数,然后重复进行运算最终产生密钥。
为了从助记词中生成二进制种子,BIP39 采用 PBKDF2 函数推算种子,其参数如下:
7. 助记词句子作为密码;
8. "mnemonic" + passphrase 作为盐;
9. 2048 作为重复计算的次数+HMAC-SHA512 作为随机算法,最终得到BIP32 种子,512 位(64 字节)是期望得到的密钥长度;
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
从根种子生成主密钥 (master key) 和主链码 (master chain code)
上图中根种子通过不可逆HMAC-SHA512算法推算出512位的哈希串,左256位是Master Private key(m),右256位是master chain code,通过m结合推导公钥的椭圆曲线算法能推导出与之对应的264位master public Key (M)。chain code作为推导下级密钥的熵。
私钥、公钥和地址产生的方式(以BTC为例)
- 比特币私钥使用SHA-256生成的32字节(256位)的随机数,有效私钥的范围取决于比特币使用的spcp256k1椭圆曲线数字签名标准;
- 在私钥的前面加上版本号,后面添加压缩标志和附加校验码,所谓附加校验码,就是对私钥经过2次SHA-256运算,取两次哈希结果的前四字节),然后再对其进行Base58编码,就可以得到我们常见的WIF(Wallet import Format)格式的私钥。
- 私钥经过椭圆曲线乘法运算,可以得到公钥。公钥是椭圆曲线上的点,并具有x和y坐标。公钥有两种形式:压缩的与非压缩的。早期比特币均使用非压缩公钥,现在大部分客户端默认使用压缩公钥。
从私钥推导出公钥、再从公钥推导出公钥哈希都是单向的,也就是采用不可逆算法。
- 公钥产生后,将公钥通过SHA256哈希算法处理得到32字节的哈希值;后对得到的哈希值通过RIPEMD-160算法来得到20字节的哈希值 ——Hash160
- 把版本号[2]+Hash160组成的21字节数组进行双次SHA256哈希运算,得到的哈希值的头4个字节作为校验和,放置21字节数组的末尾。
-
对组成25位数组进行Base58编码,最后得到地址。
下图以非压缩格式的65字节公钥示意上述过程:
公钥
keystore、密码
用户最好的体验仍然会是密码方式,所以钱包还提供了keystore让用户导出保存,这个Keystore也是私钥经过加密过后的一个文件,需要你自己设置的密码才能打开文件。这样的好处是就算keystore文件被盗,只要你额外设置的密码够长够随机,那么短时间内私钥也不会泄露,有充足的时间转移地址里面的加密货币到其他地址。Keystore会存储在使用的设备里,这样每次登陆只用输入相应密码即可。
远程过程调用(RemoteProcedure Call, RPC)
列出主流项目相关的 RPC 接口以及开源钱包项目,以供参考。
-
Bitcoin:
- RPC
Original Bitcoin client/API calls list
API reference (JSON-RPC)
JSON RPC API - Wallet
Bitcoin Core,官方出品
bitcoinj,比特币协议 Java 版
bither,简单安全的比特币钱包
Electrum,全平台轻钱包
bread,iOS 钱包
Mycelium,Android 钱包
Copay,同时支持 Bitcoin 和BitcoinCash
bitcoin-wallet,又一款 Android 钱包
DotNetWallet,.NET 实现的钱包
Coinpunk,基于浏览器的钱包
btcwallet,Go 实现的钱包
- RPC
-
Ethereum/ERC20
- RPC
JSON RPC
JSON RPC API
Management APIs
ethjsonrpc
web3.py - Wallet
go-ethereum,以太坊协议 Go 版
Mist,官方出品
Parity,支持 Windows、Mac、PC 的钱包
MetaMask
MyEtherWallet,基于浏览器的钱包
eth-lightwallet,轻量级 JavasSript 版本钱包
ethaddress.org,纸质版钱包生成器
Neureal wallet,支持 Windows、Mac、PC 的钱包
- RPC
-
其他
- Zcash
Zcash,官方出品 - BitShares
BitShares,官方出品 - Sia
Sia,官方出品 - Nem
NanoWallet,官方出品 - Dash
Dash,官方出品 - Qtum
Qtum Core Wallet,官方出品 - Litecoin
Litecoin,官方出品 - IOTA
IOTA Wallet,官方出品 - Monero
Monero,官方出品 - GXS
GXS Wallet for mobile,官方出品 - EthereumClassic
Ethereum Classic Wallet,官方出品
- Zcash
【参考文献】
声明:转载此文是出于学习和传递更多信息的目的。若有来源标注错误或侵犯了您的合法权益,请作者与我联系,将及时更正、删除,谢谢。
网友评论