你真的了解你的钱包吗?

唐煜

唐煜,北京邮电大学博士;研究方向为区块链技术、网络安全及密码学,2016年研究区块链技术以来参与过多项区块链相关研究课题,发表过多项专利及学术论文,对区块链底层技术有深刻的理解。

在区块链的世界中,个人的标识就是公钥地址,而资产的支配完全依靠私钥,所以一旦私钥丢失也就意味着资产的丢失。那么私钥会不会丢失呢?私钥会不会被黑客盗取呢?这些都是加密货币用户最关心的问题。为了清楚地解释加密货币公私钥生成的过程,我们使用一个小案例来手把手教学“破解比特币”。

首先,我们先选取一个256位的随机数,这个随机数就是用户最为保密的文件。但一个256位的数对于用户来说记住它太难了,所以钱包通常会离线生成一个助记词,利用这个助记词可以恢复一个密钥文件。在此,我们选择一个最简单的数1,作为随机源,将这个前255位为0最后一位为1的数作为私钥。利用这个数经过一个椭圆曲线算法得到一个公钥,然后将这个公钥进行SHA256算法和RIPEMD160算法得到一个公钥哈希,最后将这个公钥哈希进行Base58check编码就得到一个比特币的地址,此时我们就得到一个数字1为私钥的比特币地址

“1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm ”。然后去比特币浏览器里面查查,看看有没有这个地址,如果这个地址上有余额,那我们就中奖了。

好吧,我们来迟了一步,这个地址曾经被使用过,并且还往里面转过4.87个比特币呢。这样的方法其实就是一种正向的碰撞方式,如果你足够幸运,碰撞到一个巨额的地址,那么恭喜你,财富自由了。可这样的概率高不高呢?答案当然是非常低,这样的地址一共有2的256次方个,也就是1.16乘10的77次方,而宇宙中的原子总数估测为6乘10的79次方,所以这样的概率其实比买彩票低多了。那我们能不能通过比特币的地址逆向推出私钥呢?密码学家告诉你这是不可能的,因为椭圆曲线算法的基础数学难题是椭圆曲线上离散对数不可解问题,如果你能解出这个难题,你不仅可以财富自由还可以名留青史呢。总的来说,比特币这样的设计还是安全的。

说了这么多,我们基本已经讲清楚了比特币这类的加密货币的密钥和地址的生成过程,密钥的生成和管理主要发生在钱包里,那么钱包又是什么东西呢?他通常是怎么生成和管理密钥的呢?

钱包就是生成私钥和保存私钥的容器,它用来管理密钥和地址,跟踪地址的余额,创建和签名交易。对于钱包的类型我们可以通过交易方式、私钥的存储方式、私钥的生成方式以及数据的维护方式来进行分类。

On-chain交易

On-chain交易的钱包就是我们手机客户端使用的钱包,如starteos钱包。当我们给一个地址发送加密货币时,需要钱包对这笔交易签名并在全网广播,这笔交易是发生在区块链上的,所以称为on-chain交易。对于on-chain钱包是需要钱包客户端来生成和管理私钥的。

Off-chain交易

Off-chain交易通常是发生在交易所的,用户实际没有私钥,私钥是托管在交易所的,这时发生的交易主要记录在交易所的数据库中,所以用户最主要保存的信息是交易所账户的登录账号和密码。

冷钱包

冷钱包就是与互联网进行过物理隔绝的私钥存储容器,如Memory Box,USB硬件钱包等。Trezor钱包就是最古老的硬件钱包,私钥的生成和存储完全离线完成,发送交易时,私钥也不会在联网的计算机上缓存,所以冷钱包是最安全的私钥存储方式。

热钱包

热钱包就是私钥存储在与互联网连接的终端上的钱包,如starteos钱包等。热钱包的私钥是通过加密存储在手机中的,加密的密钥就是钱包的交易密码通过哈希加盐法生成的口令文件。

非确定性钱包

非确定性钱包就是钱包中生成的多个私钥是相互独立,两个私钥之间是没有关联的。中本聪在设计比特币核心客户端是使用了非确定性钱包,通过预先生成的100个随机公私钥对,每个公私钥对只使用一次,用完100个公私钥对后再随机生成100个,所以这种钱包的密钥很难管理、备份以及导出。

确定性钱包(HD钱包)

确定性钱包是通过对“种子”使用散列函数算法派生出多个公私钥对,这样就使得一个钱包可以产生多个地址,并可以只用保存种子文件就能恢复多个地址的私钥,目前大部分支持多地址的钱包都是分层确定性钱包( Hierarchical Deterministic Wallet,HD钱包)。使用确定性钱包的好处就是,可以将大额资金分散管理,并且分散后的密钥更便于管理、备份和导出。

全节点钱包

全节点钱包就是实时同步并保存在区块链上的所有区块数据的钱包。由于钱包需要跟踪地址的余额,所以需要保留一些区块链数据。交易所的钱包主要为全节点钱包,它们需要监控和处理大量的交易,所以需要对全部的区块链数据进行实时同步。

轻量级钱包

轻量级钱包就是只用同步与用户地址相关的区块即可,支持简单支付认证(SPV)的区块链系统,可以只用同步区块头即可完成对整个区块链数据的保存。使用Merkle树对区块中的交易进行处理,则可以大大压缩区块的体积,从而实现只用保存区块头即可对一笔交易进行验证和查询。目前我们手机中的钱包基本都是轻量级钱包。

了解了钱包的主要类别,那么一个加密货币的地址和私钥是如何在钱包中生成的呢?一个地址及私钥的生成主要经历4个阶段:生成助记词、通过助记词生成种子、通过种子派生子密钥、通过子密钥生成地址。

生成助记词

首先钱包调用一个随机数生成器生成一个128位的随机序列A,然后将这个随机序列A经过一个SHA256的哈希函数处理,取处理后的哈希值的前4位作为校验位附在随机序列A后面,得到一个132位序列B。然后将这个序列B每11位分割,得到12个片段,再对这12个片段在词库中进行匹配得到12个助记词串。

通过助记词生成种子

由上一步生成的助记词配合一个“salt”字段作为输入,通过HMAC-SHA512随机数生成算法经过2048轮的循环操作,生成最终512位的种子。

通过种子派生子密钥

首先将512位的种子文件分割为两个256位的片段,第一个256位的片段叫做主私钥,第二个256位叫做主链码。然后将主私钥经过椭圆曲线算法生成主公钥,将主公钥、主链码和索引号一起作为输入可生成子种子,再将子种子的前256位取出就得到了子密钥。

通过子密钥生成地址

当生成了子密钥之后,生成地址的过程如同文章开头的小案例。子密钥通过一个椭圆曲线算法得到一个公钥,然后将这个公钥进行SHA256算法和RIPEMD160算法得到一个公钥哈希,最后将这个公钥哈希进行Base58check编码就得到一个地址,由此就生成了一个地址与私钥。

(识别上方二维码可对作者进行打赏)

作者EOS打赏地址:0x82a358c08575e2e77ee0adefc77ad2c9fc4447cc

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180531G1AD3U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券