教程 | DIY你自己的比特币私钥,更好地保护你的资产

NBTC.World

    
    ?背景介绍
    本期将向大家介绍这一个有趣的项目,希望本文可以帮助你更好地理解比特币密钥。
    你需要的东西有:
    铅笔、纸、生成二进制随机输出的东西(如硬币)和计算机。
    这里的目的是让你做一些可以帮助你学到很多东西的东西,而不仅仅是阅读纯理论。很重要的是,本期教程体验十分容易,任何人都可以直接跟着本文的操作一起参与体验。
    
    

原文 | ARMAN THE PARMAN
    重要的序言
    不要将此密钥用于你实际持有的比特币。首先请先跟着本文练习。
    当你为你实际持有的比特币制作真正的密钥时,如果你使用这种方法,你必须在一台气密的计算机上制作它。气密计算机必须没有连接到互联网的能力。如果你非常重视安全性,仅暂时关闭普通计算机上的 wifi 连接是不够的;因为这世界上存在着聪明的黑客,即使你暂时与互联网断开连接,他们也可以提取到你的私钥。
    最后,我将解释如果你想使用此方法制作真正的钥匙,接下来该怎么做。
    好的,让我们开始吧!
    第 1 步生成大的随机二进制数
    你可以掷 256 次硬币来获得随机数,但我认为使用骰子更快更方便。你可以购买赌场级骰子以确保公平、随机的掷骰子,但也可以省钱使用任何旧骰子。即使你的骰子并不完美,有一些偏差,但从概率的角度上说,只要你一次多使用几个,你就会达到足够的随机性。
    这是众多操作步骤中的其中一个:
    

  1. 拿四个左右的骰子。
  2. 将数字 1、2 或 3 视为 0 的输出,而 4、5 或 6 将是 1 的输出。这样,你将获得带有骰子的二进制输出(最终结果中只有 0 和 1)
        例如:掷 3,记录零;掷 6,记录 1。
  3. 滚动它们并从左到右阅读(规则要保持一致且事先决定好,这对于保持随机性很重要)。如果是关于哪个更靠左或更靠右,则再次掷骰子。
  4. 制作 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 计算机。如果你使用的是 Windows 10,则可以从 Microsoft Store 安装 Ubuntu 应用程序(Linux 的一个版本)。只需搜索“Ubuntu”并安装它。你将使用 Ubuntu 终端运行以下命令。该应用程序是一个临时会话;没有文件存储在 Ubuntu 应用程序上。这意味着你每次运行它时都会得到一个干净的会话。
    Windows 用户需要执行此解决方法,这很麻烦。我尝试了其他解决方法,但遇到了各种问题。
    现在你的 Mac、Linux 或 Windows 10 机器上有一个终端,输入下面的命令。用你自己的随机二进制数字替换我的二进制数字(注意这应该是一个很长的行,即使它在这里显示的方式可能看起来不同)。
    echo 1010111100111000000011110110001111010111101001010010001011001111011110100011000010100011111100100010100011110001110101000110011111110000101000110001010111010001010011111110101001010011110110110110000001101111010011000001110101101001000010001000010000100111 | shasum -a 256 -0
    如果你不习惯命令行,则会很难理解这一点。
    我会拼出来:
    输入“echo”,然后是一个空格,然后是一系列没有任何空格的零和一,然后是一个空格,然后是“管道”符号(通常在大多数键盘上的 键下方),然后一个空格,然后是“shasum”命令,一个空格,连字符“a”,一个空格,“256”,一个空格,另一个连字符,然后是零位。然后按 。
    代码说明:“echo”命令只会重复你接下来输入的任何内容。管道符号(“|”)获取该输出并将其传递给管道符号右侧的命令(它将数据从左侧“管道”到右侧!)。比特流的接收者是“shasum”散列命令。“-a”是一个选项,用于指定要使用的算法。“256”代表比特币世界著名的SHA-256,这是我们对“-a”的选择。最后,“-0”是一个选项,表示输入应该被解释为二进制数据,而不是常规文本(又名 ASCII)数据。
    当我运行此命令时,我的结果哈希显示在命令下。这是以“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 位数字(请参阅下图中的第 24 行是如何完成的)
    第 3 步将二进制转换为十进制
    每组 11 位二进制数字都需要转换为十进制数。
    限于本期练习,你可以将它们输入到在线二进制到十进制计算器中。但是,对于你真正的钱包,我将向你展示如何手动操作。
    关于二进制
    在二进制数系统中,只有 0 和 1。你知道的其他数字(2、3、4、5、6、7、8、9)不存在。所以向上计数,我们从 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 步对应 BIP 39 词表
    BIP 39 协议(比特币改进提案编号 39)指定了 2048 个不同的单词,按字母顺序列出。当这个列表被代码读入时,每个单词都可以通过它在列表中的有序位置来识别。你刚刚计算的数字将用于查找其对应的单词。例如,第一行的结果是数字 1401,它等于有序 BIP 39 词表中的“quanlity”一词。
    零是你可以为一行计算的最小可能值(来自二进制 00000000000)。在这种情况下,你将选择“abandon”,这是列表中的第一个词。
    最大可能的数字是 2047(来自 11111111111)。正确的词是“zoo”,这是列表中的最后一个词。这是第 2047 个字。
    有一个令人困惑的问题需要注意:计算机从 0 开始计数项目。所以列表中的第五项是计算机的数字 4。
    这种额外的混乱是不幸的。BIP 39 单词的官方规范在 GitHub 上,但单词列表显示的行号以 1 开头而不是 0 开头。因此,虽然“abstract”是第 8 个单词并列在第 8 行,但其实际的 BIP 39 数字等效值为 7。
    
    我的第一行 11 个二进制数字加起来是 1401 十进制。所以在 Github 的列表中,我必须在第1402 行(1401 + 1)找到这个词。这个词就是“quanlity”。继续查找每个小数点——注意在你的计算结果中添加一个额外的 1 以匹配 Github 的行号——并找到? 24 ?行中每一行的单词。
    
    
    如果你坚持做到了这一步,那就太好了!
    你现在拥有一个有效的 24 字比特币助记词。你现在应该把它扔掉——除非你使用完全手动的方法,否则你不能将它们用于你的比特币,因为它们不是在安全的环境中创建的!
    其实,在你扔之前,你可以把这些词输入硬件钱包或软件钱包,看看它们是否被拒绝。如果它被拒绝,则说明你在某处犯了错误,因为使用这种手动方法很容易产生错误。如果任何地方有任何错误,校验和将不匹配,所有钱包都会立即发出错误信号。
    实践到真实的比特币私钥
    你确实需要在气密计算机上生成密钥。
    你可以在此处学习构建 10 美元的廉价 Raspberry Pi 零气隙计算机,购买一台现成的计算机,或者如果你有多余的钱,你可以构建一台没有任何 wifi 或蓝牙组件的定制台式计算机。Raspberry Pi 这个选项非常便宜,但计算机速度非常慢,因此请注意。如果你想在多重签名设置中拥有许多分布式密钥,那它是很好的选择。
    除了安全生成密钥之外,你还必须考虑存储和复制或分发。
    为了大幅降低你遭受攻击或丢失的风险,下一个级别是学习多重签名钱包。
    如果你处于存储的单一签名密钥阶段(大多数人都是),那么你真的应该将助记词保存在硬件设备中。大多数人让硬件钱包 (HWW) 制作他们的密钥,而从不在气密计算机上验证该密钥。这对大多数人来说没问题。但是,如果你是偏执狂,你应该验证密钥是否生成了你期望的公钥和地址。
    既然你知道如何安全地制作自己的密钥(根据上述完全手动的离线方法),你就不必相信 HWW 来生成好的密钥。你首先自己制作一个新密钥,然后不是在硬件设备上创建新钱包,而是“恢复”钱包并将新计算的单词输入设备。然后这些词会在 HWW 中“锁定”并受你的 PIN 保护。
    因此,硬件设备是你私钥的数字保险箱。
    你永远不应该只有一份你的私钥。如果你丢失了它,你将丢失密钥存储的所有比特币。从技术上讲,设备中没有比特币;他们在区块链上。正如我所说,硬件钱包是你的私钥的数字保险箱,由你刚刚制作的单词表示。
    HWW 中的代码使用数学函数从私钥计算你的扩展公钥,然后从扩展公钥以数学方式推导出许多单独的公钥。然后每一个都可以用来计算看似无限的地址集合。一切都在私钥的下游。你可以在不同的设备中输入您的私钥,并可靠地(数学上)生成完全相同的公钥和地址集合。更多细节在这里。
    这么说的目的是让你意识到比特币就好像存储在你创建的 24 个字上一样——而不是硬件钱包。你应该非常非常小心地备份这些话,让他们免受小偷和自然灾害的伤害。如果你制作副本并将它们存储在不同的位置,那么在一个位置发生火灾不会导致你丢失所有比特币,因为你将在其他地方拥有副本。
    私钥传递和保存
    一旦你拥有在气密计算机上生成的密钥并非常安全地备份它们,就该考虑如何将它们传递给你的后代了。
    有受信任的第三方可以持有你的密钥,或者你可以以无需信任的方式制定计划——我的首选。我很乐意帮助有需要的人。
    Happy Bitcoining.