# 7 比特币私钥是怎么产生的,它可以被破解吗?

96
程序员在深圳
0.3 2017.12.28 12:53* 字数 1751
题图

如果你拥有比特币,你可能最关心的是余额,而决定余额的是私钥,所以你最应该关心的,其实是私钥。当我们谈到比特币安全相关的问题时,我们也会提到私钥,之前的文章《比特币的助记符是什么》里提到的助记符,其实也可以理解为私钥的一种表现形式,但私钥究竟是什么?也许鲜有人知道。

私钥是什么

私钥是一个256位的随机数

私钥的定义非常简单,但其中有2个专业术语可能会使不了解计算机的同学感到困惑,一个是256位,另一个是随机数,下面内容是该定义的白话文解释,已经理解了的同学可以跳过:

256位 - 字面上很容易被理解为256个十进制数字,其实不是的,因为计算机是用二进制来存储和计算的,所以256位指代的是256个二进制数字,下图是一个例子


随机数 - 意思是这个数的产生没有规律

所以

私钥是一个数字,这个数字可以取从0到2²⁵⁶-1之间的任意值

私钥可以被破解吗

看到这里,你可能也会产生和我一样的疑惑——私钥也太简单了把,我随便写一个数,只要不超过最大值,就可以用作私钥,对吗?是这样的,没错。

那按照私钥可以算出公钥,公钥可以产生地址的逻辑,岂不是我随便选一个数作为私钥,然后算出它的地址,如果这个地址上正好有未使用的比特币,是不是就代表我破解了别人的账号呢?

年轻人,你说得没错,其实我一开始也是这样想的,虽然现在回想起来觉得有点Naive……

虽然私钥只是一个简单的数字,但它仍然很难被破解,原因在于这个数字的集合足够大,大到我们很难穷尽所有数字,并对它们进行逐一的验证。2的256次方近似于10的77次方,10的77次方有多大,我再举个例子你就清楚了

到目前为止,人类可观测的宇宙中的原子数约为10的80次方

进一步,因为这个数的范围很大,所以我们能猜中一个正确私钥的概率就变得非常低,假设地球上使用比特币的人数达到100亿,也就是10的10次方,则你猜中一个比特币私钥的概率是

这个概率到底有多小呢,我再给你举两个例子:

  1. "双色球"一等奖的中奖概率是8×10ˉ⁸。——摘自《中国福利彩票的中奖概率》
  2. 从全世界范围来看(假设全世界人口为70亿),一年中每个人遭遇雷击的概率是175万分之一(5×10ˉ⁷)。——摘自中国气象局-《遭遇雷击的概率有多高》

说明什么呢?说明

被雷击中的概率 > 抽中500万的概率 >> 猜中比特币私钥的概率

上面的不等式中,我用了>>这个符号表示远远大于

从概率的角度,我们确实很难破解私钥,但此时你可能会问,彩票一等奖和被雷击中很难发生,在于它们发生的频率很低,但计算机不一样,计算机的计算速度很快,我们可以很容易的利用计算机的处理速度,来提升猜中私钥的可能性,也就是快速计算10的67次方个私钥,总有一次猜中把。

是的,通过这种暴力破解的方法确实可以实现破解比特币的私钥,但它要付出的代价也是极其高昂的,下面我们就来做个试验。

我在我的Macbook Pro 2015版上运行了一条命令

$ begin=`date +%s`;  for ((i=0;i<10;i++));do bx seed | bx ec-new | bx ec-to-public | bx ec-to-address | xargs -I@ ./btc_balance -addr @ > /dev/null; done; end=`date +%s` ; echo `echo "scale=2;$end-$begin" | bc`
15

这条命令看不明白没关系,我来介绍下它的功能:

这条命令会随机产生10个比特币的私钥和地址,并获取它的余额,这是暴力破解的基本步骤(其实还差一步判断余额是否大于0,如果大于0就代表猜中了,但我们这里只预估成本,可以省去这一步),产生10个私钥的目的是为了利用计算机的并行能力,因为我的CPU有4个核心;这条命令还会输出程序运行所需要的时间,可以看到最后一行的15表示运行了15秒

利用这个程序的输出,我们就可以计算出猜中一个私钥需要花多长时间了,猜10个私钥需要15秒,那么10⁶⁷次猜测,需要


注意,经过换算,等式右边的单位已经是年了,通过简单的实验和计算,我们可以估算出,想要暴力破解比特币私钥,几乎是不可能完成的任务。

使用安全的算法产生私钥

即便私钥的设计已经足够安全,但如果使用不当,仍然会产生严重的后果,正如统计结果显示:目前还是有很多人使用1234567作为他们的账户密码——就是一个典型的例子。

我们不要自己去生成私钥,最好借用比特币软件,例如钱包或bitaddress.org这样的站点来帮你产生私钥,这里简单介绍下这些软件产生私钥的原理,大致分为3个步骤:

  1. 产生一个很长的随机字符串(随机源)——例如bitaddress.org网站就是通过捕捉人们滑动鼠标的随机行为来产生随机源的。
  2. 将步骤1的数据输入到SHA256 hash算法,输出一个256位的数
  3. 确保产生的数在私钥规定的范围之内,否则重新回到第1步

通过这篇文章,相信你对私钥有了更深层次的认识,同时也对比特币的安全性有了足够的信心,如果这篇文章对你有帮助,作为反馈,你可以在文章后面留言,或给我打赏一丁点代币 :)

0xf7eA2c5C7cF4E3f384de97109685a02a8ED92BC6

区块链
Web note ad 1