主页 > imtoken.im > 五分钟了解比特币私钥的转码和使用

五分钟了解比特币私钥的转码和使用

imtoken.im 2023-03-13 07:18:16

原标题:《科普 | 比特币的私钥:转码与使用》

通常关心自己比特币财富安全的人应该试着理解下图:

数字

如果您完全了解二进制、十进制和十六进制,则可以跳过本节。

十进制表示每个数字有 10 种可能性(0、一、二、三、四、五、六、七、8或9)。数字“6.15”有3位数字(顺便说一下,数字6.15有特殊含义,即每个人都应该努力拥有6.15比特币)。第一个数字是“6”,第二个是“1”,第三个是“5”。这三个数字可以是0、任意@>一、二、< @三、四、五、六、七、八、9.

在十进制中,我们从“0”计数到“9”(0、一、二、三、四、五、六、 < @七、八、9) 不会有新的数字,所以我们需要在左边加一个“1”(即每十个一),得到“10” ,然后从“0”开始计数——原来的“9”变成1,十位变成“1”,一位变成“0”。

二进制意味着每个数字只有两种可能性(“0”和“1”)。

在二进制中,我们从“0”开始计数,然后是“1”,然后是“10”!你有瞥见吗?如果您认为跨度很大,那是因为您没有考虑过十进制。

在十进制中,“10”是普通人的手指数——因为我们有 10 根手指,所以我们人类经常使用以 10 为底的数字。

然而,在二进制中,“10”是一个人的拇指数。想象用拇指数数:一、十、十一、100、10一、1Ten一、1000、 @>1001…

如果这是您第一次理解二进制,那么在纸上和笔本身上进行数学运算可能会有所帮助。这就像第一次学习数数一样,不能依靠直觉。

十六进制表示每个数字有 16 种可能性(0、一、二、三、四、五、六、 七、< @八、九、a、b、c、d、e、f)。这里,a=十、b=ten一、c=ten二、d=1三、e=14 和 f=15。

就像在扑克中一样,Jack=Ten一、Queen=Ten二、King=1三、Ace=14 或 1。一个字母可以代表一个数字,这就是症结所在。

每个单个数字的可能性越多,用于表示大数的数字就越少。例如,十进制的 2047 是二进制的 11111111111(11 位),十六进制的 7FF。

总结:

随机二进制数、校验和、私钥

私钥以可以转换为其他形式的二进制数开头。但是,私钥本质上是一个二进制数,因为它是供计算机使用的。下面是一个二进制私钥的例子:

010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111

请注意,这个私钥由 24 组数字组成,每组数字是 11 个数字的集合,总共 264 位二进制数字(24×11=264).

虽然计算机看到的私钥是一串统一的数字比特币钱包公钥在哪查看,但是没有空格:

010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111

这是一个非常大的数字,用十进制写成:

7,869,270,257,961,728,227,967,109,454,183,816,220,476,881,432,001,550,169,555,390,346,110,510,455,025,983

请注意,这两个数字的值是一样的,不同的是小数点更短。

简而言之,私钥的一部分是随机生成的,最后8位(称为校验和)通过公式计算出来,作为前一个随机部分的输入。这是一个工程设计(软件钱包协同识别):如果数据输入错误,计算机将检测到输入数据的检查和不匹配,并警告用户。钱包会提醒你“对不起,你可能犯了错误”。当然,用户可以强制选择继承。校验和不是比特币代码的一部分,它的引入是为了确保用户的安全。

换句话说...通过数学设计,在建立私钥时,以下随机扇区...

0100001111110101110110010010000010100110100010000100011100010110110010011011111010000011110010000011011111001000010101000001011101100110000110111000010011011011110011100101011110011010000010011100000100001001000001110011100111101011100011001110101101110001

只会生成以下校验和并且...

00111111

将两者联系起来会产生最终的私钥。单击此处了解私钥是如何产生的,以及它是如何验证和计算的。请注意,8位校验和最后3位随机数恰好是11位数字的一组,与其他组相同(在BIP39标准下,一个词需要11位表示,详见下文)。

不同的随机二进制数也会有不同的校验和。如果用户在钱包中输入私钥并声明“这是我之前生成的私钥,请显示我的位置”,只要有数字错误,软件钱包城就会发现并发出警告。

请原谅我有点麻烦,但了解这些系列非常重要。

私钥转换

人类很难正确记录下一个二进制私钥并将其输入软件钱包。一旦出现问题,比特币可能会丢失。手写不能用校验和来检查错误,只有输入电脑才能。

一种解决方案是将二进制数转换为十进制数,使私钥更短且更易于记忆。

如果将一个二进制数分成 11 位一组,每组数最多可以隐含 2048 个十进制数字(可表示的十进制数字范围是“0”到“2047”)。将“0”到“2047”转换为二进制是“00000000000”到“11111111111”。

我们可以把这个私钥转换成 24 组十进制数,每组范围从“0”到“2047”。这很容易编写,但仍然容易出错。

BIP39可以有效解决这一隐患。该协议建议比特币用户使用协议所说的单词列表,我怀疑这些单词是经过精心挑选的,以防止误读为其他单词。

BIP 39 单词列表包括按字母顺序排列的 2048 个单词。单击此处查看列表。除了英文版,还有其他语言版本。每个单词代表一个介于“0”和“2047”之间的数字。这样,私钥中的每个十进制数都可以写成一个单词。数字和对应的词之间有什么特殊联系吗?不,它只是协议定义的,只要我们都使用这个协议,就可以在单词和数字之间画等号。

这就是种子词的来源。你在软件钱包里输入助记词后,每个单词都转换成11个二进制数字,组合起来会形成一个264位的二进制数,就是私钥(还记得最后一个单词吗?包括校验和是否随机) . 如果是12个字组成的助记词,那么私钥的长度只有一半,也就是132位。

遗憾的是,原始 BIP 39 单词表存储在 GitHub 中,表示十进制范围“1”到“2048”,而不是“0”到“2047”。这只是 Github 看中的问题,并非设计成那样。

为了澄清这个问题,让我们举个例子。如果一个私钥的开头是11个“0”,比如“00000000000”,那么我们就用单词表的第一个单词来表示二进制数。第一个词是“abandon”,意思是“00000000000”,但标有“1”。这是错误的。十进制数“1”转换成二进制是“00000000001”,这不是我们想要的。但是,由于一个奇特的问题,单词列表中的所有单词都被编号为“1”,高于它们实际表示的十进制数。

我们还可以通过抛硬币来生成二进制数。计算机可以帮助我们得到用斜体表示的最后 8 位数字:

010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111

我们要做的第一件事是将这个二进制数分成 11 个数字组:

010000111111010111011001001000001010011010001000010001110001011011001001101111101000001111001000001101111100100001010100000101110110011000011011100001001101101111001110010101111001101000001001110000010000100100000111001110011110101110001100111010110111000100111111

接下来,我们将每组数字转换为十进制:

543、1398、577、616、1059、1115、311、1667、1601、1522、168、374、781、1555、889、1623、1232、624、530、115、1269、1587、1390

然后,我们在词表上查询这些十进制数对应的词:

测试你:十进制数543对应什么字?干的,鸭子还是哑巴?

上图取自Github,所以这个词表的序号是从“1”开始的。因此,每个序号减去“1”后,就是每个字对应的十进制数。因此,编号为544的单词dumb实际上代表的是“543”,也就是我们要找的单词。

第二个数字是1398比特币钱包公钥在哪查看,对应词表上的词号1399。

将所有数字转换成单词后,就是:

愚蠢的把其他逃跑的爱合并便宜的备用

视觉沙拉长凳进行巨人第二百

板老 唤起 激烈 攻击 契约 鞋 拳 孩子

请注意,所有单词都是按字母顺序排列的,前面第一个字母的单词代表较小的数字,第一个字母后面的单词代表较大的数字。当你理解了这些词的排序规则后,你就可以清楚地看到这一点。

展开私钥

看下面的图片:

扩展私钥是使用二进制私钥和密码短语以及派生路径计算的,基于您和我都不必知道的数学公式。

请注意增长密码是如何完全逆转私钥的负扩展的。修改实时路径也会反转下游数据。不要小看你的软件钱包提供的默认激活路径,一定要记下来保存。我会再写一篇文章详细介绍直播路径。

放大后的私钥最终用于生成钱包中的所有比特币位置,并可以在这些位置使用比特币。如上图所示,扩展私钥可以生成多个独立的私钥(不是扩展私钥,而是普通私钥),每个私钥都会生成一个独立的公钥,每个公钥都会生成一个位置。

扩展后的私钥也可以用来生成扩展后的公钥。

我们不能从单个独立的私钥推导出扩展的私钥。这是我个人的理解,但我不是密码学专家,所以我不能确定,但​​这样想是公平的。但是,每个独立的私钥都可能指向后一个独立的私钥,尽管我不确定这一点。所以,可以肯定的是,永远不要向任何人透露你的任何私钥。

可以肯定的是,两个公钥都不会泄露其对应的私钥。显然这是非常重要的。

我过去创建了一个测试钱包。这个网站是练习创建虚拟钱包的好处的好地方(永远不要使用这种方法在联网的计算机上创建真正的钱包)。

展开私钥如下:

请注意,上图为“账户”扩展私钥。我不知道为什么这个网站有这样的标志。

让我们看看这个扩展私钥的开头是“x”。这象征着使用此私钥的传统位置将以“1”开头。传统位置也称为 P2PKH(支付到公钥哈希)位置。

使用以“y”开头的私钥(或公钥)将生成以“3”开头的位置。这些位置也称为 P2SH(支付脚本哈希)位置。

使用以“z”开头的私钥将生成本机 segwit/Bech32 位置。这些位置以“bc1q”开头。

最后,以字母“X”、“Y”或“Z”开头的私钥将为多重签名钱包生成一个位置。

展开公钥

扩展公钥的用处不是很明显。如果你仔细看底部的指示,你会发现钱包软件使用扩展公钥生成的比特币位置与使用扩展私钥生成的比特币位置是一样的,位置的顺序也是一样的。使用扩展公钥和扩展私钥创建的钱包看起来完全一样。那么区别在哪里呢?

可以使用扩展私钥生成的钱包进行支付。

无法使用使用公钥生成的钱包进行支付。这种钱包通常被称为“查看”钱包。你可以把这个钱包放在安全性较低的电脑上,不用担心丢失私钥,但它可以用来检查你的钱包余额,或者复制位置发送给其他人。

但是您仍然应该注意保护您的扩展公钥。一旦披露,其他人可以通过满足您的扩展公钥来检查您的钱包余额和您的所有位置。从现在开始,他们可以像查看银行对账单一样查看您的钱包余额。

保护您的财务隐私,同时也保护您的财务密钥(比特币私钥)。

注意:展开公钥如下图:

如上图所示,公钥不是以“xprv”开头,而是以“xpub”开头,也可以以“ypub”、“zpub”、“Xpub”、“Ypub”和“Zpub”开头。(大写指的是多签私钥。)

总结

我希望这篇文章能帮助你了解比特币的公钥和私钥,从而让你更容易理解比特币的工作原理。