• app_navCreated with Sketch.app_navCreated with Sketch.

    App

    扫码下载APP

  • tougao_navCreated with Sketch.tougao_navCreated with Sketch.

    投稿

  • Sign in_navCreated with Sketch.Sign in_navCreated with Sketch.

    登录

  • register_navCreated with Sketch.register_navCreated with Sketch.

    注册

蚂蚁S9 13.5T 云算力
WECC世界杯活动
BTM云算力
比特币私钥是什么?关于比特币私钥的详细说明
2018-05-02 11:24:23

比特币私钥是什么?

私钥

先说说私钥,一般我们看到的私钥是下面这样的一段字符串:

5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss

支持比特币协议的应用都可以正确把这段字符串转换成比特币的私钥,再转换出公钥,再得到一个地址,如果该地址上面有对应的比特币,就可以使用这个私钥花费上面的比特币。

私钥本质上是随机数私钥本质上是一个随机数,由32个byte组成的数组,1个byte等于8位二进制,一个二进制只有两个值0或者1。所以私钥的总数是将近2^(8*32)=2^256个,但是有一些私钥并不能使用,他真实的大小是介于:1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间的数。这个数量已经超过了宇宙中原子的总数,想要遍历所有的私钥,耗尽整个太阳的能量也是不可能的。

我们所说的比特币私钥的是密码学上面安全的,并不是说不可能出现重复的私钥,而是说不可能通过遍历的方式找到某一个特定的私钥,或者通过其它的方式找,而不通过私钥就能花费地址上面的比特币,私钥的安全性是由数学上保证的。

私钥的总数量很大,但是私钥的生成是依赖随机数的,真正的随机是很难做到的,大部分私钥的生成都是依赖于伪随机算法(PRNG)。

伪随机是用函数生成随机数。它并不真正是随机的。只是一个比较近似真随机的随机数。

私钥生成的随机性就很重要的,密码学上安全的随机是指:

随机是不可预测的,随机的结果是不可遍历的,如果不是安全的随机数生成器,生成的私钥就有可能被别人碰撞到。不依赖随机生成的私钥就会大大的降低其生成的概率空间。

公钥和地址的生成都依赖私钥,所以我们只需要保存私钥即可,有了私钥就能生成公钥和地址,就能够花费对应地址上面的比特币。

私钥到字符串

上面提高的私钥字符串是按照一定的规律从32位byte数据格式化生成的,32个byte的数组是由256个0或者1组成的,如果显示出来,不仅仅是识别率不高,而且私钥太长。

因此私钥字符串就是对于原始的随机数进行一定的转换,转换为识别率高的形式,上面私钥的是对32个byte数组就做了Base58的转换.

Base58是用于比特币中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址和私钥。相比Base64,Base58不使用数字”0″,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/”符号。这样做的主要原因是为了肉眼容易识别,在输入的时候不容易打错,

不过上面那段没有规律的字符串输入起来还是挺费劲的,当然也可以把私钥转换其他形式,比如以单词的形式(12或者24个单词),脑钱包的形式,又或者自己记住的某一句话来生成私钥,注意脑钱包生成的私钥随机的安全性并不高。

我们看到的私钥除了以5开头的以外,还有以L和K开头的私钥,为什么会出现这样的情况呢?5,L,K又带代表什么呢?这就要说到公钥了。

关于比特币私钥详细说明

私钥就是一个随机选出的数字而已。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。

比特币私钥只是一个数字。你可以用硬币、铅笔和纸来随机生成你的私钥:掷硬币 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