主页 > imtoken离线钱包 > 2010btc私钥地址 4.5.2 P2SH(付费方式

2010btc私钥地址 4.5.2 P2SH(付费方式

imtoken离线钱包 2023-09-26 05:10:54

4.5 个高级密钥和地址

在以下部分中,我们将介绍高级形式的密钥和地址,例如加密的私钥、脚本和多重签名地址、虚地址和纸质钱包。

4.5.1 个加密私钥(BIP0038)

私钥必须保密。对私钥保密的需求的现实是,在实践中很难实现,因为这一要求与同样重要的可用性安全目标相矛盾。当您存储备份以避免丢失私钥时,您会发现很难维护私钥的隐私。使用密码加密存储私钥的钱包可能更安全一些,但该钱包也需要备份。例如,有时用户需要将密钥从一个钱包转移到另一个钱包,因为他们想要升级或重新安装他们的钱包软件。私钥备份可能还需要存储在纸上(请参阅“纸钱包”部分)或外部存储介质,例如 U 盘。但是如果备份文件被盗或丢失怎么办?这些相互冲突的安全目标导致了 BIP-38 的引入,这是一种可移植、方便且被许多不同钱包和比特币客户端理解的加密私钥标准(有关 BIP-38 的详细信息,请参见附录)。

BIP-38 提出了一个通用标准,用于使用密码加密私钥并使用 Base58Check 对加密的私钥进行编码,以便加密的私钥可以安全地存储在备份媒体上并在钱包之间安全地传输,从而确保密钥安全任何可能的暴露。此加密标准使用 NIST 制定的高级加密标准 (AES),广泛用于商业和军事应用中的数据加密。

BIP-38加密方案是:使用比特币私钥作为输入,私钥通常用WIF编码,base58chek字符串以“5”为前缀。 BIP-38 加密方案还需要一个长密码作为密码,通常由多个单词或数字和字母的复杂字符串组成。 BIP-38加密方案的结果是经过base58check编码的加密私钥,前缀为6P。如果您看到一个以 6P 开头的密钥,则表示该密钥已加密,需要密码才能将密钥转换(解密)为 WIF 格式的私钥(以 5) 为前缀。现在许多钱包应用程序都可以识别 BIP -38 加密的私钥2010btc私钥地址,并会提示用户输入密码来解码导入的密钥。第三方应用程序,例如基于浏览器的比特地址的钱包详细信息选项卡非常有用,也可用于解码 BIP-38键。

BIP-38 加密密钥最常见的用例是纸质钱包:在一张纸上备份私钥。使用 BIP-38 加密私钥的纸质钱包非常安全,只要用户选择强密码,这也是离线存储比特币(也称为“冷存储”)的好方法。

在 bitaddress.org 上测试表 4-5 中的加密密钥,看看输入密码如何生成加密密钥。

表 4-5 BIP-38 加密私钥示例

私钥 (WIF)5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

密码

MyTestPassphrase

加密密钥(BIP-38)

6PRTHL6mWa48xSopbU1cKrVjpKbBZxcLRRCdctLJ3z5yxE87MobKoXdTsJ

4.5.2 P2SH(Pay-to-Script Hash)支付脚本哈希和多重签名地址

众所周知,传统的比特币地址以数字 1 开头,由公钥派生,而公钥又派生自私钥。虽然任何人都可以将比特币发送到以 1 开头的地址,但在提供相应的私钥签名和公钥哈希之前,不能使用比特币。

以数字 3 开头的比特币地址是 P2SH 地址,有时被错误地称为多重签名或多重签名地址。他们将比特币交易的受益人指定为脚本哈希,而不是公钥的所有者。此功能由 BIP-16 于 2012 年 1 月引入(参见附录 appdxbitcoinimpproposals)并被广泛采用正是因为 BIP-16 提供了向地址本身添加功能的机会。与 P2PKH(pay-to-public-key-hash,支付公钥哈希)不同,交易将资金发送到以 1 开头的传统比特币地址,而当资金发送到以 3 开头的地址时,不仅需要公钥哈希和私钥签名以证明所有权。这些要求是在创建地址时在脚本中指定的,并且该地址的所有输入都将使用相同的要求。

P2SH 地址是从交易脚本创建的,这些脚本定义了谁可以使用此交易输出(请参阅“P2SH(Pay-to-Script-Hash)”部分)。 P2SH 地址使用与创建比特币地址相同的双哈希函数进行编码,但应用于脚本而不是公钥:

  1. script hash = RIPEMD160(SHA256(script))

得到的“脚本哈希”使用Base58Check编码,版本前缀为5,最后生成以3开头的编码地址。P2SH地址的一个例子是3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM。可以使用比特币浏览器命令脚本 encode、sha256、ripemd160 和 base58check encode 导出(见附录 appdx_bx]),例如:

  1. $ echo \
  2. 'DUP HASH160 [89abcdefabbaabbaabbaabbaabbaabbaabbaabba] EQUALVERIFY CHECKSIG' > script
  3. $ bx script-encode < script | bx sha256 | bx ripemd160 \
  4. | bx base58check-encode --version 5
  5. 3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM

提醒 P2SH 不一定是多重签名交易。虽然 P2SH 地址通常代表多重签名,但它们也可能代表编码其他类型交易的脚本。

4.5.2.1个多重签名地址和P2SH

目前,P2SH 最常见的实现是多重签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权才能花费资金。比特币的多重签名特性的设计要求是在总共 N 个密钥中要求 M 个签名(也称为“阈值”),称为 M-N 多重签名,其中 M 等于或小于 N。例如,第 1 章提到的咖啡店老板 Bob 使用的多重签名地址,需要 1-2 个签名,一个给他的钥匙,一个给他妻子的钥匙,任何一方都可以签名花费这个地址锁定输出。这类似于传统银行的“联名账户”,任何一方都可以注册单独消费。或者像 Bob 聘请的网页设计师 Gopesh,可能需要一个 2-3 的多重签名地址,以确保至少有两个合作伙伴签署了交易,然后才能进行付款。

我们将在第 5 章交易中探讨如何为 P2SH(和多重签名)地址构建交易以花费资金。

4.5.3 虚荣地址

虚地址也是一个有效的比特币地址,但为了提高可读性。例如,1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 是有效地址,前 4 个字符 Base-58 包含字母 love。虚地址需要生成和测试数十亿个候选私钥,直到比特币地址满足模式要求。虽然有一些优化的虚荣生成算法,但这些算法必然涉及随机选择私钥、生成公钥、生成比特币地址,并检查它是否匹配所需的虚荣模式,需要数十亿次重复才能找到匹配项。

一旦找到与所需模式匹配的虚地址,该虚地址的私钥就会像任何其他地址一样由所有者以比特币的形式使用。虚荣地址并不比其他地址更安全。它们依赖与其他地址相同的椭圆曲线加密 (ECC) 和 SHA。查找以虚号开头的地址的私钥并不比查找其他地址容易。

在第 1 章中,我们介绍了菲律宾一家儿童慈善机构的负责人 Eugenia。让我们假设 Eugenia 组织了一个比特币筹款活动,并希望使用一个虚荣的比特币地址来宣传筹款活动。 Eugenia 将从 1Kids 开始创建一个化妆地址,以促进儿童慈善筹款活动。让我们看看这个虚荣地址是如何创建的,以及它对 Eugenia 慈善筹款的安全意味着什么。

4.5.3.1 生成虚地址

应该意识到,比特币地址只不过是一组由 Base58 字母表中的符号表示的数字。查找以“1kids”开头的个性化号码就像查找 1Kids111111111111111111111111111 到 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 范围内的地址。以“1kid”开头的地址范围大约有 5829 个地址(大约 1.4 * 1051))。表 4-6 显示了这些以“1kids”为前缀的地址范围。

表4-6“1Kids”号码范围

来自1Kids11111111111111111111111111111

1孩子1111111111111111111111111112

1孩子1111111111111111111111111113

1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

我们将前缀“1Kids”视为一个数字,以查看该前缀在比特币地址中出现的频率。没有任何特殊硬件的普通台式计算机每秒搜索大约 100,000 个键。

表4-7 1KidsCharity出现频率及生成时间

LengthPatternFrequencyAverage 搜索时间

1

1Ki

58 个键中的 1 个

< 1 毫秒

2

1Ki

3,364 分之一

50 毫秒

3

1个孩子

195,000 分之一

< 2 秒

4

1个孩子

1100 万分之一

1 分钟

5

1KidsC

6.56 亿分之一

1 小时

6

1KidsCh

380 亿分之一

2 天

7

1KidsCha

2.2 万亿分之一

3-4 个月

8

1KidsChar

128 万亿分之一

13-18 岁

9

1KidsChari

七万亿分之一

800 年

10

1KidsCharit

400 万亿分之一

46,000 年

11

1KidsCharity

23 万亿分之一

2.五百万年

如您所见,Eugenia 无法很快创建以“1KidsCharity”开头的虚荣地址,尽管她同时运行着数千台计算机。每增加一个字符,计算难度就会增加 58 倍。超过 7 个字符的虚数通常需要找到专门的硬件,例如具有多个 GPU 的定制桌面。通常,无法继续开采比特币的矿工被赋予寻找虚名地址的任务。使用 GPU 搜索虚数比通用 CPU 快许多数量级。

另一种查找虚地址的方法是外包给虚矿池,例如虚矿池。矿池提供一项服务,通过为他人寻找虚荣地址来组织拥有 GPU 硬件的人来赚取比特币。 Eugenia 可以以少量(在撰写本文时大约为 0.01 比特币或 5 美元)外包对 7 字符模式的虚荣地址的搜索,您可以在几个小时内得到它。结果,无需不得不自己运行 CPU 搜索数月。

生成虚地址是一个蛮力过程:尝试随机密钥,检查生成的地址是否与所需的模式匹配,重复该过程直到找到成功。示例 4-9 是一个虚荣挖掘的例子,它是一个用 C++ 编写的用于查找虚地址的程序。此示例使用我们在“其他替代客户端、库、工具包”部分介绍的 libbitcoin 库。

示例4-9 虚号挖掘程序

链接:代码/vanity-miner.cpp[]

注释 下面的示例 4-10 使用 std::random_device。根据实现的不同,可能会映射到底层操作系统提供的 CSRNG。在 Linux 等类 Unix 操作系统中,它来自 /dev/urandom。此处使用的随机数生成器仅用于演示目的,不适合生产级比特币密钥2010btc私钥地址,因为它不够安全。

示例代码需要通过链接libbitcoin库与C++编译器进行编译(该库需要提前安装在系统上)。运行此示例将执行不带参数的 vanity-miner 可执行文件(参见示例 4-1 0),它将尝试查找以“1kid”开头的虚地址。

示例 4-10 编译运行 vanity-miner 程序示例

```$ # 用 g++$ 编译代码 g++ -o vanity-miner vanity-miner.cpp $(pkg-config --cflags --libs libbitcoin)$ # 运行示例$ ./vanity-minerFound vanity地址! 1KiDzkG4MxmovZryZRj8tK81oQRhbZ46YTSecret: 57cc268a05f83a23ac9d930bc8565bac4e277055f4794cbd1a39e5e71c038f3f$ # 再次运行它以获得不同的结果$ ./vanity-miner 找到虚荣地址! 1Kidxr3wsmMzzouwXibKfwTYs5Pau8TUFn秘密:7f65bbbbe6d8caae74a0c6a0d2d7b5c6663d71b60337299a1a2cf34c04b2a623