?背景介绍
本期将向大家介绍这一个有趣的项目,希望本文可以帮助你更好地理解比特币密钥。
你需要的东西有:
铅笔、纸、生成二进制随机输出的东西和计算机。
这里的目的是让你做一些可以帮助你学到很多东西的东西,而不仅仅是阅读纯理论。很重要的是,本期教程体验十分容易,任何人都可以直接跟着本文的操作一起参与体验。
原文|ARMANTHEPARMAN
重要的序言
不要将此密钥用于你实际持有的比特币。首先请先跟着本文练习。
当你为你实际持有的比特币制作真正的密钥时,如果你使用这种方法,你必须在一台气密的计算机上制作它。气密计算机必须没有连接到互联网的能力。如果你非常重视安全性,仅暂时关闭普通计算机上的wifi连接是不够的;因为这世界上存在着聪明的黑客,即使你暂时与互联网断开连接,他们也可以提取到你的私钥。
最后,我将解释如果你想使用此方法制作真正的钥匙,接下来该怎么做。
好的,让我们开始吧!
第1步
生成大的随机二进制数
你可以掷256次硬币来获得随机数,但我认为使用骰子更快更方便。你可以购买级骰子以确保公平、随机的掷骰子,但也可以省钱使用任何旧骰子。即使你的骰子并不完美,有一些偏差,但从概率的角度上说,只要你一次多使用几个,你就会达到足够的随机性。
这是众多操作步骤中的其中一个:
拿四个左右的骰子。将数字1、2或3视为0的输出,而4、5或6将是1的输出。这样,你将获得带有骰子的二进制输出例如:掷3,记录零;掷6,记录1。滚动它们并从左到右阅读。如果是关于哪个更靠左或更靠右,则再次掷骰子。制作23行11位数字。第24行只需要三位数字。对于每一行,将数字分成4-4-3组以便于阅读和计算。尽可能保持垂直列对齐,并在每行之间留出空间以进行手动计算。这一切都会在以后变得有意义。像这个例子:?
这里有256个二进制数字——23组完整的11位数字,第24行只需要3位数字。
稍后你会更清楚地看到,但现在,请了解二进制的每11位数字都将被转换为助记词。对于总共256个随机二进制数字,我们可以除以11以获得助记词中的单词数。但是256除以11的答案不是整数;现在是23.27。我们的助记词中不能有23.27个单词。
我们还需要8个位来构成第24个字。一旦我们总共有264位,它就可以很好地分成24组,每组11,产生一个24字的助记词。正如你稍后将看到的,这最后八个额外的位将发挥自己的重要作用。
关于随机性的说明:
你可以按照任何你想要的方式制作这256位随机数据,只要它实际上是随机的。如果它不是随机的,那么别有用心的人极有可能重现你的数据。然后他们将能够重新创建你的私钥并可以拿走你所有的比特币。
例如,如果你生成256位全为零,那么有人极有可能能够猜出你的私钥。
而下方图示就是证据:我从可怕的全零随机性中生成了一个私钥,并找到了某人现有的钱包。如果它没有被清空,我可能已经窃取了资金。
他们清楚地知道自己在做什么,因为金额很小,而且他们不会长时间在这个地址留下任何比特币。谁知道呢,这可能是一场示威。但是其他人生成了可猜测的非随机私钥,结果导致他们丢失了他们的比特币。但别担心,如果你制作了一个真正随机的私钥,有人将不得不精确地重复你的二进制掷骰子或掷硬币,而且由于指数数学,这在宇宙的生命周期中是不会发生的。
第2步
计算校验和
需要计算最后缺失的八位数字以形成所谓的“校验和”。
什么是校验和?
校验和是计算机在你输入信用卡号或银行帐号等信息时知道你输入错误的方式。让计算机警告你在输入你的比特币私钥时显示输入错误是一件很有用的事情!
要计算校验和,你需要一台Linux或Mac计算机。如果你使用的是Windows10,则可以从MicrosoftStore安装Ubuntu应用程序。只需搜索“Ubuntu”并安装它。你将使用Ubuntu终端运行以下命令。该应用程序是一个临时会话;没有文件存储在Ubuntu应用程序上。这意味着你每次运行它时都会得到一个干净的会话。
Windows用户需要执行此解决方法,这很麻烦。我尝试了其他解决方法,但遇到了各种问题。
现在你的Mac、Linux或Windows10机器上有一个终端,输入下面的命令。用你自己的随机二进制数字替换我的二进制数字。
echo1010111100111000000011110110001111010111101001010010001011001111011110100011000010100011111100100010100011110001110101000110011111110000101000110001010111010001010011111110101001010011110110110110000001101111010011000001110101101001000010001000010000100111|shasum-a256-0
如果你不习惯命令行,则会很难理解这一点。
我会拼出来:
输入“echo”,然后是一个空格,然后是一系列没有任何空格的零和一,然后是一个空格,然后是“管道”符号,然后一个空格,然后是“shasum”命令,一个空格,连字符“a”,一个空格,“256”,一个空格,另一个连字符,然后是零位。然后按。
代码说明:“echo”命令只会重复你接下来输入的任何内容。管道符号获取该输出并将其传递给管道符号右侧的命令。比特流的接收者是“shasum”散列命令。“-a”是一个选项,用于指定要使用的算法。“256”代表比特币世界著名的SHA-256,这是我们对“-a”的选择。最后,“-0”是一个选项,表示输入应该被解释为二进制数据,而不是常规文本数据。
当我运行此命令时,我的结果哈希显示在命令下。这是以“b184”开头的行:
现在我们可以开始计算校验和。我们取散列输出的前两位数字,在本例中为“b”和“1”。这些是十六进制数。在十六进制中,我们不显示从0到9的数字,而是通过使用字母表中的字母表示大于9的数字来数到15:
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
类似于扑克牌如何使用自己的替换从1到13计数:
Ace,2,3,4,5,6,7,8,9,10,Jack,Queen,King
所以在我的哈希中,我的第一个数字“b”代表11。十六进制中的“1”与我们习惯处理的“1”相同。
现在我们将这前两个数字转换为它们的四位二进制表示。您可以参考下面的图表来做到这一点:
▲四位二进制中的11是1011。四位二进制中的1是0001。
所以我们从b和1,到11和1,最后到1011和0001。
这些四位数字是我们将添加到位来完成第24个字的校验和!
将它们添加到第24行以完成最终的11个二进制数字集。那么,你现在总共就会有264位数字
第3步
将二进制转换为十进制
每组11位二进制数字都需要转换为十进制数。
限于本期练习,你可以将它们输入到在线二进制到十进制计算器中。但是,对于你真正的钱包,我将向你展示如何手动操作。
关于二进制
在二进制数系统中,只有0和1。你知道的其他数字不存在。所以向上计数,我们从0开始,然后是1,但下一个数字是不寻常的。没有可用的“2”。所以1之后的下一个最大数字是“10”。不要读成“十”,读成“一,零”。在二进制中,“10”代表你习惯的“2”。10之后的下一个数字是“11”。这等于十进制的“3”。对于下一个数字“12”是不可能的,因为二进制中没有“2”数字;我们可以用零和一表示的下一个最大数字是“100”。这实际上是十进制的“4”。然后101=5,110=6,111=7,1000=8,1001=9等等。
有11个二进制数字,最小的可能数为零(00000000000),最大的数为2047(11111111111)。
我们将页面上的这11个二进制数字中的每一个都转换为十进制。你可以手动完成,也可以在Linux、Mac或Ubuntu应用程序中从命令行转换它们。
对于数字10101111001,你需要输入:
echo"$((2#10101111001))"
你会得到“1401”的输出值。只需更改10101010101以匹配每组十一位数字并计算其等效的十进制数。
1401是怎么来的呢?
下面,我通过纸笔来手动计算一下。
在页面的顶部,从右到左写下这个精确的数字序列,与下面的二进制数字垂直对齐:“1024”在二进制数字的第一列上方。然后在下一列中显示“512”。然后是“256”。以此类推,每次将数字减半,直到二进制数字的最后列上方出现“1”为止。
现在看看你的第一行二进制数字。只要有“1”,就添加它正上方的十进制数,并将其记录在二进制数字下方。如果有“0”,则忽略上面的数字。像这样:
在这个例子中,在1024列、256列、64、32、16、8和1下有一个“1”。
将十进制数相加得到总数1401:
现在对所有24行都重复此操作:
你现在将拥有24个介于0和2047之间的十进制数字。
第4步
对应BIP39词表
BIP39协议指定了2048个不同的单词,按字母顺序列出。当这个列表被代码读入时,每个单词都可以通过它在列表中的有序位置来识别。你刚刚计算的数字将用于查找其对应的单词。例如,第一行的结果是数字1401,它等于有序BIP39词表中的“quanlity”一词。
零是你可以为一行计算的最小可能值。在这种情况下,你将选择“abandon”,这是列表中的第一个词。
最大可能的数字是2047。正确的词是“zoo”,这是列表中的最后一个词。这是第2047个字。
有一个令人困惑的问题需要注意:计算机从0开始计数项目。所以列表中的第五项是计算机的数字4。
这种额外的混乱是不幸的。BIP39单词的官方规范在GitHub上,但单词列表显示的行号以1开头而不是0开头。因此,虽然“abstract”是第8个单词并列在第8行,但其实际的BIP39数字等效值为7。
我的第一行11个二进制数字加起来是1401十进制。所以在Github的列表中,我必须在第1402行找到这个词。这个词就是“quanlity”。继续查找每个小数点——注意在你的计算结果中添加一个额外的1以匹配Github的行号——并找到?24?行中每一行的单词。
如果你坚持做到了这一步,那就太好了!
你现在拥有一个有效的24字比特币助记词。你现在应该把它扔掉——除非你使用完全手动的方法,否则你不能将它们用于你的比特币,因为它们不是在安全的环境中创建的!
其实,在你扔之前,你可以把这些词输入硬件钱包或软件钱包,看看它们是否被拒绝。如果它被拒绝,则说明你在某处犯了错误,因为使用这种手动方法很容易产生错误。如果任何地方有任何错误,校验和将不匹配,所有钱包都会立即发出错误信号。
实践到真实的比特币私钥
你确实需要在气密计算机上生成密钥。
你可以在此处学习构建10美元的廉价RaspberryPi零气隙计算机,购买一台现成的计算机,或者如果你有多余的钱,你可以构建一台没有任何wifi或蓝牙组件的定制台式计算机。RaspberryPi这个选项非常便宜,但计算机速度非常慢,因此请注意。如果你想在多重签名设置中拥有许多分布式密钥,那它是很好的选择。
除了安全生成密钥之外,你还必须考虑存储和复制或分发。
为了大幅降低你遭受攻击或丢失的风险,下一个级别是学习多重签名钱包。
如果你处于存储的单一签名密钥阶段,那么你真的应该将助记词保存在硬件设备中。大多数人让硬件钱包(HWW)制作他们的密钥,而从不在气密计算机上验证该密钥。这对大多数人来说没问题。但是,如果你是偏执狂,你应该验证密钥是否生成了你期望的公钥和地址。
既然你知道如何安全地制作自己的密钥,你就不必相信HWW来生成好的密钥。你首先自己制作一个新密钥,然后不是在硬件设备上创建新钱包,而是“恢复”钱包并将新计算的单词输入设备。然后这些词会在HWW中“锁定”并受你的PIN保护。
因此,硬件设备是你私钥的数字保险箱。
你永远不应该只有一份你的私钥。如果你丢失了它,你将丢失密钥存储的所有比特币。从技术上讲,设备中没有比特币;他们在区块链上。正如我所说,硬件钱包是你的私钥的数字保险箱,由你刚刚制作的单词表示。
HWW中的代码使用数学函数从私钥计算你的扩展公钥,然后从扩展公钥以数学方式推导出许多单独的公钥。然后每一个都可以用来计算看似无限的地址集合。一切都在私钥的下游。你可以在不同的设备中输入您的私钥,并可靠地生成完全相同的公钥和地址集合。更多细节在这里。
这么说的目的是让你意识到比特币就好像存储在你创建的24个字上一样——而不是硬件钱包。你应该非常非常小心地备份这些话,让他们免受小偷和自然灾害的伤害。如果你制作副本并将它们存储在不同的位置,那么在一个位置发生火灾不会导致你丢失所有比特币,因为你将在其他地方拥有副本。
私钥传递和保存
一旦你拥有在气密计算机上生成的密钥并非常安全地备份它们,就该考虑如何将它们传递给你的后代了。
有受信任的第三方可以持有你的密钥,或者你可以以无需信任的方式制定计划——我的首选。我很乐意帮助有需要的人。
HappyBitcoining.
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。