比特币私钥(比特币私钥详细说明)
私钥就是一个随机选出的数字而已。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。
比特币私钥只是一个数字。你可以用硬币、铅笔和纸来随机生成你的私钥:掷硬币 256 次,用纸和笔记录正反面并转换为 0 和 1,随机得到的 256 位二进制数字可作为比特币钱包的私钥。该私钥可进一步生成公钥。
从一个随机数生成私钥
生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。生成一个比特币私钥在本质上与"在 1 到 2256 之 间选一个数字"无异。只要选取的结果是不可预测或不可重复的,那么选取数字的具体方法并不重要。比特币软件使用操作系统底层的随机数生成器来产生 256 位 的熵(随机性)。通常情况下,操作系统随机数生成器由人工的随机源进行初始化,也可能需要通过几秒钟内不停晃动鼠标等方式进行初始化。对于真正的偏执狂, 可以使用掷骰子的方法,并用铅笔和纸记录。
更准确地说,私钥可以是 1 和 n-1 之间的任何数字,其中 n 是一个常数(n=1。158*1077,略小于 2256),并由比特币所使用的椭圆曲线的阶所定义。要生成这样的一个私钥,我们随机选择一个 256 位的数字,并检查它是否小于 n-1。从编程的角度来看,一般是通过在一个密码学安全的随机源中取出一长串随 机字节,对其使用 SHA256 哈希算法进行运算,这样就可以方便地产生一个 256 位的数字。如果运算结果小于 n-1,我们就有了一个合适的私钥。否则,我 们就用另一个随机数再重复一次。
本书强烈建议读者不要使用自己写的代码或使用编程语言内建的简易随机数生成器来获得一个随机数。我们建议读者使用密码学安全的伪随机数生成器 (CSPRNG),并且需要有一个来自具有足够熵值的源的种子。使用随机数发生器的程序库时,需仔细研读其文档,以确保它是加密安全的。对 CSPRNG 的 正确实现是密钥安全性的关键所在。以下是一个随机生成的私钥(k),以十六进制格式表示(256 位的二进制数,以 64位十六进制数显示,比特币价格每个十六进制数占 4 位):
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
比特币私钥空间的大小是 2256,这是一个非常大的数字。用十进制表示的话,大约是 1077,而可见宇宙被估计只含有 1080 个原子。
要使用比特币核心客户端生成一个新的密钥(参见之前文章),可使用getnewaddress 命令。出于安全考虑,命令运行后只显示生成的公钥,而不显示私钥。如果要bitcoind 显示私钥,可以使用dumpprivkey 命令。dumpprivkey 命令会把私钥以 Base58 校验和编码格式显示,这种私钥格式被称为钱包导入格式(WIF,Wallet Import Format),在"私钥的格式"一节有详细讲解。下面给出了使用这两个命令生成和显示私钥的例子:
$ bitcoind getnewaddress 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
$ bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
dumpprivkey 命令只是读取钱包里由 getnewaddress 命令生成的私钥,然后显示出来。bitcoind 的并不能从公钥得知私钥。除非密钥对都存储在钱包里,dumpprivkey 命令才有效。
dumpprivkey 命令无法从公钥得到对应的私钥,因为这是不可能的。这个命令只是提取钱包中已有的私钥,也就是提取由 getnewaddress 命令生成的私钥。你也可以使用命令行 sx 工具 (参见"Libbitcoin和 sx Tools")用 newkey 命令来生成并显示私钥!
$ sx newkey 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
","content_hash"!"2a64e7fc
评论