钱包软件日益成熟,用户数增加很快,但有个疑问一定困扰过你:凭什么说钱包软件自动生成的私钥是绝对随机、无法被暴力猜到的?
这个质疑很硬核,回答是:是否经历足够长的时间考验。
如果自动生成的私钥不随机,盗币事件早晚爬上头条,不过这几年,伪随机私钥被盗事件并未发生。
想想几轮暴涨,有多少黑客以每秒亿级的速度来暴力破解,你看完这句话的时候,全世界黑客已经试过几十亿的私钥了,但那么多的用户钱包里的币都很安全。
所以,从这个角度上说,主流钱包还都算经受住了考验。虽然数学上不存在绝对的真随机数,但就算是伪随机数,也伪得不厉害。
- 1 -
进一步的追问是:钱包随机生成的私钥为什么必然牢靠呢?
这个追问无法证实,只能证伪——任何人只能在某一地址的币被盗的那一刻证明对应的私钥不牢靠,而无法在被盗之前证明牢靠。
唯一的办法就是自己做私钥。
我们知道,私钥看起来是一串长到记不住的字符,但本质上是一个介于0-2^256(2的256次方)之间的整数。2^256是一个极大的数:
115792089237316195423570985008687907853269984665640564039457584007913129639936
也就是1.15×10^77
接近于宇宙中所有原子的数量(10^80个),任何人想要遍历一遍这些数字,至少需要烧掉一万亿个太阳的能量,也不太可能获得万亿分之一的机会。
不是太阳太小,而是数学太大。
如果我们能自己指定这个数,那么就能比一般人更深一层保护私钥。
比如,抛256次硬币,正面记1,反面记0,那么原汁原味的私钥就是一个二进制数:
0011101000010111100010101101010111001011111111011010000001111101111011010001010011110100011001011100100011011000101010011000111101011111101101111011100001110100100100011010100111101110001111001011100010001000010111100101111000110111110010100101100011101110
但这个私钥并无法直接导入主流钱包,转换成这样的形式:
KyAdjFHRghuF7HWgLEew4odTWCiifKDvcXf2QEtvHdQbk7BZpe6q
那么,要找个趁手的工具,因为手算手会酸。人生苦短,人人用Python。
- 2 -
Python是个开源软件,代码全公开,现在一般都用Python3,安装好后,Windows用户启用Python的IDLE:
也可以下载Anaconda3,使用其中的Spyder:
手把手教学前,需要提前在命令行安装bitcoin模块:
Windows用户左下角“开始”,搜索“cmd”调出命令行,输入:pip install bitcoin,下载模块:(Mac用户直接在命令行中输入)
先在控制台中导入bitcoin模块:
import bitcoin
进而,输入三行代码就能土法泡制私钥。
注意,最好在断网环境下输入代码,因为你无法保证信息不外流。
第一行,输入二进制私钥k_2(注意,二进制数外面要套英文引号):
k_2='0011101000010111100010101101010111001011111111011010000001111101111011010001010011110100011001011100100011011000101010011000111101011111101101111011100001110100100100011010100111101110001111001011100010001000010111100101111000110111110010100101100011101110'
第二行,将二进制私钥转换成十进制私钥k_10:
k_10=int('0b'+str(k_2),2)
注:‘0b’代表是二进制数,Python中int函数是将其他进制转换成十进制。
第三行:将十进制私钥转换成WIF压缩格式的私钥k,也就是钱包能用的格式:
k = bitcoin.encode_privkey(k_10, 'wif_compressed')
实盘运行效果如下:
- 3 -
在私钥产生的同时,公钥和地址也几乎同步产生,我们只需输入两行代码:
公钥K:
K = bitcoin.privkey_to_pubkey(k)
地址A:
A = bitcoin.pubkey_to_address(K)
跑代码效果:
当然,你也可以把这些代码写在一个.py文件里:
在第二行写入你亲自抛硬币得出来的二进制私钥,按下F5,你会听到一阵风:
私钥和地址就都自动出来了。
再次提醒需在断网环境操作,确保绝对安全。
最后,可试着将私钥导入钱包,地址自动浮现: