返回

文章详情

恢复乱码的比特币地址(2024)

Hacker News2026年7月4日 23:12

2024年4月23日 电报 本文中有许多代码片段。您可以从一个仓库下载它们。完成的项目在这里。曾几何时,有一个名为ZeroNet的去中心化网络。与后来的流行内容寻址存储网络(如IPFS)不同,ZeroNet使网站能够实时更新,这些网站可以由其所有者动态管理,例如博客和论坛。因此,这些网站不能通过不可变哈希来寻址。然而,主要开发者并不想发明新的密码学,因此他可能做出了最聪明的决定:网站通过比特币地址来寻址,其内容和更新由该地址签名。如果您还没有使用比特币,以下是其地址的样子:1Lbcfr7sAHTD9CgdQo3HTMTkV8LK4ZnX71。相比之下,网络上的一个典型域名看起来像这样:purplesyringa.moe。主要区别在于比特币地址区分大小写,而人们习惯于地址不区分大小写。这导致了诸如使用http://zero/1Lbcfr7sAHTD9CgdQo3HTMTkV8LK4ZnX71而不是http://1Lbcfr7sAHTD9CgdQo3HTMTkV8LK4ZnX71.zero的黑客行为,但错误仍然会发生,有时你唯一的线索就是一个小写地址,比如1lbcfr7sahtd9cgdqo3htmtkv8lk4znx71。这就是信息如何丢失的。我当时正在努力归档ZeroNet,因此因人为错误导致的任何信息丢失都值得修复。我们真的失去了对这个网站的访问吗,如果我们只知道小写地址?我们可以以某种方式恢复原始地址吗?什么是地址?一个常见的误解是比特币地址是公钥的编码。事实并非如此。相反,地址包含对公钥哈希的编码。这是一个用户体验的决策:哈希比公钥短,因此更易于使用,但仍然足够长以确保安全性。事实证明,中本聪还考虑了其他用户体验的因素。比特币地址不仅编码了公钥的哈希,还有一个校验和。如果有人在转账时对目标地址输入错误,比特币客户端会注意到这一点,并取消交易。这种保护比IBAN的要可靠得多:校验和是SHA256(SHA256(key_hash))的前四个字节。最后一个重要部分是编码不是您最喜欢的base64,而是base58。不同之处在于base58排除了容易混淆的字符0、O、I和l,以及不符合URI安全的字符+和/(并且可能造成混淆),以及由于填充无用而排除的=。这里有一个简单的说明:私钥(随机32字节)通过ECDSA魔法映射到公钥(33字节)。公钥然后经过SHA-256和RIPEMD-160哈希生成一个20字节的字符串。在哈希前加上一个1字节的地址类型(0x00)会产生一个21字节的有效负载。该有效负载经过SHA-256哈希两次,前4个字节用作校验和。有效负载和校验和连接后,生成一个25字节的解码地址。这个地址然后使用base58编码,生成一个约34个字符的可读字符串。私钥(随机32字节)通过ECDSA魔法映射到公钥(33字节)。公钥然后经过SHA-256和RIPEMD-160哈希生成一个20字节的字符串。在哈希前加上一个1字节的地址类型(0x00)会产生一个21字节的有效负载。该有效负载经过SHA-256哈希两次,前4个字节用作校验和。有效负载和校验和连接后,生成一个25字节的解码地址。这个地址然后使用base58编码,生成一个约34个字符的可读字符串。第一次尝试 我们能不能通过暴力破解所有小写/大写的组合,检查是否有任何有效的地址?我们就试试这个。 import base58 import itertools address_lowercase = "1lbcfr7sahtd9cgdqo3htmtkv8lk4znx71" def try_both_cases ( c ): yield c if c.upper() != c: yield c.upper() for address in itertools.product(* map (try_both_cases, address_lowercase)): address = "".join(address) try : base58.b58decode_check(address) except ValueError: pass else : print ( "找到有效地址:" , address) $ time python3 attempt1.py ^CTraceback (most recent call last): File "/home/purplesyringa/btccaserestore/attempt1.py", line 16, in <module> base58.b58decode_check(address) File "/home/purplesyringa/.local/lib/python3.11/site-packages/base58/__init__.py", line 152, in b58decode_check result = b58decode(v, alphabet=alphabet, autofix=autofix) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/purplesyringa/.local/lib/python3.11/site-packages/base58/__init__.py", line 128, in b58decode acc, mod = divmod(acc, 256) ^^^^^^^^^^^^^^^^ KeyboardInterrupt real 1m47,770s user 1m47,301s sys 0m0,027s 第二次尝试 是的,用Python是一种错误。它可能不会在宇宙热寂之前终止。让我们用Ru重写它。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡