千家信息网

如何进行Electrum比特币钱包的Python代码分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何进行Electrum比特币钱包的Python代码分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如果你仍然未对Py
千家信息网最后更新 2026年11月01日如何进行Electrum比特币钱包的Python代码分析

如何进行Electrum比特币钱包的Python代码分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

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

了解代码

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

https://github.com/spesmilo/electrum/releases/tag/2.8.3

种子生成器文件基本上位于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个函数就可以完成,但是像这样使用它更优雅,更不容易出错,因为它可以处理异常。我不是一个很好的Classes专家,所以我就这样吧。

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

  • None =英语

  • en =英语

  • es =西班牙语

  • zh =中文

  • ja =日语

  • pt =葡萄牙语

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

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

你还可以生成多种类型的种子,你可以在version.py文件中看到:

  • standard:普通钱包。

  • segwit:支持即将推出的基于Segregated Witness softfork的比特币地址。

  • 2fa:基于双因素身份验证的钱包。

  • 下一个参数是num_bits变量,它使用nbits命令从命令行调用,基本上只是你的种子将拥有的位数熵(建议安全性最小值为128)

  • 最后一个参数是custom_entropy,基本上只是一个整数,可以使用该整数乘以种子数,以防你的RNG不好,这将用你自定义生成的数字替换密码的一部分,具有相同的熵大小。

因此,如果我这样称呼它,我选择了一个自定义熵数,这将以这种方式生成种子,当然熵数也必须是一个秘密:

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

我真的不建议使用这个代码,它看起来有点奇怪,我不是加密专家,但我只是不喜欢这如何将熵插入你的数字。我听说乘数会减少熵,所以我不确定代码的这一部分。事实上,我将向开发者发送关于此问题的信息,看看他对此有何回应。但是不用担心,默认钱包生成不会调用自定义熵部分,因此如果你通过GUI在Electrum中生成钱包,或者将其保留设置为1,那么无需担心。

分析种子生成器

好了,现在我们知道如何生成种子,让我们看看种子生成器究竟做了什么。毕竟使用Electrum的所有人都必须依赖此代码的安全性和完整性,否则如果这些代码被写得很糟糕,你可能会损失所有的钱。因此,如果我们想在Electrum中存储大量比特币,我们必须100%信任此代码。那么让我们分析吧。

那么让我们分析一下make_seed()函数,这就是动作的位置,首先我会在其中放入许多打印代码,以便在每一步打印出每个变量:

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

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

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

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

  • 首先导入version.py,其中文件的代码是,它基本上将该standard参数转换为01,后者将成为种子的前缀。所以它将前缀设置为01字符串。

  • 然后bwp(每个字的位数)变量取字列表长度的log2值,我的意思是那里有多少个单词,在这种情况下是英文列表:english.txt。英语列表中有2048个单词,其中log2为11。

  • 然后将num_bits除以bwp并向上舍入,转换为整数并再次乘以bwp。我不知道为什么这是必要的,因为它给出了相同的值,我想这只是某种预防措施。

  • 如果我们将custom_entropy保留为默认值1,则n_custom将变为0,因此不会添加额外的熵。

  • n如果没有添加自定义熵,它仍然与num_bits输入相同。

  • 所以基本上如果你生成一个没有额外熵的默认钱包,那么n变量就会成为主数,其中包含你最初通过num_bits定义的熵量。因此,在我们的情况下它保持等价,因为我们不添加任何东西。

  • 然后my_entropy将只选择0到2的n次方之间的随机数,其中n是同名的n,所以它将是一个很大的数字,这是种子的原型。

  • 然后我们进入while循环来搜索以01开头的随机数,它将作为种子的校验和。

  • 如果自定义熵为0,那么基本上我们只需将my_entropy数加1,直到前2位变为0和1.实际上它的前2位是hash格式。所以发生的是它用mnemonic_encode(i)对其进行编码,并在用mnemonic_decode(seed)对其进行解码之后,我猜测是否可以用单词编码,否则会产生一些错误。这就是assert命令所做的,它会测试错误。

  • 然后它进入is_new_seed()函数,如果你现在生成一个种子,如果你以旧格式导入旧种子然后它进入旧函数。但是我上面执行的这段代码进入了新功能。这就是奇迹发生的地方。is_new_seed()函数实际位于bitcoin.py文件中:

  • 这里发生的事情很有意思,首先使用mnenonic.py文件中的normalize_text()函数对种子进行规范化,我认为中文或其他奇怪的语言会被转换成我认为的ASCII文本。所以这个功能与英文单词列表并不多。

  • 然后就是当事情变得有趣时,它采用种子列表的HMAC-SHA512哈希,在它的英文文本版本中基本上就是我们的情况。它检查前两个字符是01,因为我们称之为标准钱包。Electrum将标准钱包定义为种子,其种子版本的HMAC-SHA512以01开头,一个Segwit钱包,其编码种子版本的HMAC-SHA512以02开头等等......所以基本上循环增加my_entropy变量1直到在我们的例子中,它给出的使用Seed版本编码的HMAC-SHA512的单词列表以01开头。在找到该数字后,它退出循环,并返回种子。

就是这样,这就是Electrum生成种子的基本方式。这个种子的HMAC-SHA512总和将从01开始,你甚至可以自己检查。所以在Linux中你可以安装一个名为GTKHash的工具来计算哈希值,所以让我演示一下,我们取种子,然后添加HMAC消息种子版本,如该函数所定义:

因此,可以看到我们是否将HMAC消息Seed版本与种子一起添加,它为我们提供了以01开头的512位hash,因此在这种情况下,这是与Electrum兼容的有效默认种子。

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

但是有一个问题,如果我们修复十六进制格式的前两个字符,显然HMAC-SHA512输出是十六进制格式,那么就会失去熵。

这就是为什么我们从132位的熵开始,因为我们丢失了大约4位的熵,因此最后的输出只有128位的熵,这是我们想要的默认情况,使用128位的安全熵,事实上,鉴于计算机的强大功能,建议现在使用120位以上。

所以我们从132位开始,由于修复了前2个字符,我们丢失了一些位,然后我们保持128位,这在计算上是安全的。为了暴力破解这需要超级计算机通过2128种组合,这几乎是不可能的,因为地球上没有足够的能量来经历那么多组合,事实上有些人说你甚至不能算到这个数字范围,更不用说hash和其他内存密集型操作。

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

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

毕竟成千上万的人都使用Electrum,特别是那些持有大量的人,所以最好安全使用,而且在我看来是这样。

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

种子 代码 生成 函数 文件 钱包 安全 只是 就是 版本 分析 变量 命令 情况 单词 参数 开头 数字 这是 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 山东特亿宝互联网科技有限公司 重生之互联网科技帝国 国智互联网科技 港股互联网科技股 易互联网科技有限公司 喔噻互联网科技 成都互联网科技公司 贷财互联网科技 安控科技rtu产品工业互联网 哈尔滨新华互联网科技学院 科技互联网的估值 茂名市互联网科技产业园 广州新华互联网科技学校电竞方面 互联网科技公司营业执照怎么办理 华中科技大学互联网的牛人 互联网科技资金流入 21世纪互联网科技成就 珠海东科互联网科技有限公司 互联网的黑科技实验室 互联网科技会 杭州互联网科技公司 凡科互联网科技 湖南洣水互联网科技有限公司扣款 注册互联网科技公司经营范围大全 华夏恒生互联网科技013171 互联网科技公司营业执照怎么办理 智帮互联网科技公司最近动向 科技互联网经济论坛 互联网的科技体现在哪里
0