主页 > imtoken钱包下载安卓最新版本 > Electrum比特币钱包Python代码分析

Electrum比特币钱包Python代码分析

如果您仍然对 Python 语言的强大感到惊讶,那么在这一部分中,我们将学习如何使用 Python 开发比特币地址或钱包。 我只是想说与您的计算机通信是多么容易,如果您通过 python 和 linux,您可以用它做多少有趣的项目。

在本文中,我将分析 Electrum 的源代码,这是一个纯 Python 编写的比特币钱包,它应该适用于任何 python 2.x,我相信即使使用 python 3.x 包,默认情况下所有依赖软件都是使用默认包。 因此,不需要额外的软件。

免责声明:使用此代码和信息的风险由您自行承担,对于因使用修改后的代码和本文中提供的信息而可能造成的任何损害,我概不负责。 如果你不知道自己在做什么,建议不要修改生成私钥的代码!

理解代码

我从 Github 下载了最新版本的 Electrum 源代码:

种子生成器文件基本在lib里面,名字叫mnemonic.py,函数是make_seed(),就是这段代码:

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

您实际上也可以通过内部命令从终端调用它。 所以,如果你安装了 Electrum,它看起来像这样:

electrum make_seed --nbits 125

比特币私钥验证_比特币私钥公钥签名_比特币私钥是什么

安装 Electrum 后,将为您创建 125 位种子,但您也可以通过另一个 python 文件调用助记符脚本,并对其进行自定义(例如生成多个,或与其他代码集成)。

我们将创建一个名为 testcall.py 的新文件,我们将在其中调用此助记符代码,但它必须位于同一个 lib 文件夹中。 它看起来像这样:

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

如果我们使用 python testcall.py 命令从终端调用它:

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

基本上,我们从 mnemonic.py 文件中导入 Mnemonic 类,并将其称为助记符。 我还没有谈到类,它们处于 Python 语言的更高层次部分,基本上它们是将函数绑定在一起的对象。 这里的 make_seed() 函数包含在 Mnemonic 类中,并通过它与依赖于其他函数的其他函数一起调用。 它只需要 1 个函数就可以完成,但是像这样使用它更优雅并且更不容易出错,因为它处理异常。 我不是一个很好的课程专家,所以我就这样吧。

比特币私钥是什么_比特币私钥公钥签名_比特币私钥验证

在 Mnemonic 类中,可以定义 1 个参数,即语言,它具有以下值:

您可以在 i18n.py 文件中看到国家代码,但现在只有这些代码的列表可用,在 wordlist 文件夹中可见。 如果您创建中文种子,只需将此参数替换为国家代码:

print Mnemonic('zh').make_seed('standard', 132, 1)

您还可以生成多种类型的种子,如您在 version.py 文件中所见:

所以如果我这样调用它,我选择一个自定义的熵数,它将以这种方式生成种子,当然熵数也必须是秘密的:

print Mnemonic('en').make_seed('standard', 132, 2349823353453453459428932342349489238)

我真的不建议使用此代码,它看起来有点奇怪,而且我不是加密专家,但我只是不喜欢它如何将熵插入到您的数字中。 我听说乘法器会减少熵,所以我不确定这部分代码。 事实上,我打算就此事向开发人员发送消息,看看他如何回应。 但不用担心,默认钱包生成不会调用自定义熵部分,因此如果您通过 GUI 在 Electrum 中生成钱包,或者将其设置为 1,则无需担心。

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

分析种子生成器

好了,现在我们知道了如何生成种子,让我们看看种子生成器到底做了什么。 毕竟每个使用 Electrum 的人都必须依赖这段代码的安全性和完整性,否则如果这段代码写得不好,你可能会损失所有的钱。 所以如果我们想在 Electrum 中存储大量比特币,我们必须 100% 信任这个代码。 那么我们来分析一下。

那么让我们来分析一下make_seed()函数,这就是动作所在,首先我会在里面放很多打印代码来打印出每一步的每个变量:

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

基本上我只是在每一步打印出每个变量。 好的,我们使用 python testcall.py 命令从 testcall.py 文件中调用 make_seed() 函数。 测试调用文件如下所示:

print Mnemonic('en').make_seed('standard', 132, 1)

只是一个标准的种子生成,它打印出:

比特币私钥公钥签名_比特币私钥是什么_比特币私钥验证

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

好吧,让我们一步一步来。

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

就是这样,这基本上就是 Electrum 生成种子的方式。 这个种子的HMAC-SHA512和会从01开始,你自己查也可以。 所以在Linux中你可以安装一个叫做GTKHash的工具来计算hash,所以让我演示一下,我们取种子,然后添加HMAC消息种子版本,通过这个函数定义:

比特币私钥公钥签名_比特币私钥验证_比特币私钥是什么

图片

因此可以看出,如果我们将 HMAC 消息种子版本与种子一起添加,它会为我们提供一个从 01 开始的 512 位哈希,因此在这种情况下,这是与 Electrum 兼容的有效默认种子。

比特币私钥验证_比特币私钥是什么_比特币私钥公钥签名

当然 HMAC 系统是牢不可破的,特别是它的 512 位版本可能是量子计算机抗性的,所以没有办法对该系统的种子进行逆向工程。

但是有一个问题,如果我们将前两个字符固定为十六进制格式比特币私钥验证,显然HMAC-SHA512输出的是十六进制格式,那么熵就会丢失。

这就是为什么我们从132位的熵开始,因为我们丢失了大约4位的熵,所以最终输出的只有128位的熵,这就是我们想要的默认值,使用128位的安全熵,实际上,鉴于电脑的功率,建议现在用120位以上。

所以我们从 132 位开始,由于固定前 2 个字符,我们丢失了一些位,然后我们保持在 128 位,这在计算上是安全的。 要暴力破解,这需要超级计算机完成 2128 种组合比特币私钥验证,这几乎是不可能的,因为地球上没有足够的能量来完成这么多组合,事实上有人说你甚至无法计算那个数字范围,让单独哈希和其他内存密集型操作。

综上所述

看起来 Electrum 可以安全使用。 它已经过我的审计,虽然我不是加密专家,但从我的研究和学习来看它对我来说是安全的。

我仍然对 custom_entropy 持怀疑态度,我应该问问 dev 到底做了什么,但除此之外,默认的钱包生成是完美无缺的。 我不认为有后门。

毕竟有成千上万的人使用 Electrum,尤其是那些持有大量资产的人,所以最好谨慎行事,我认为是这样。

我在本文中分析了它的主要种子生成代码。 当然代码远不止于此,但我们已经知道,如果您使用它在离线计算机上生成种子,它应该是安全的。 现在我还没有看过它与网络相关的部分,但我相信它们是安全的。

================================================ == =====================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程: