主页 > imtoken靓号地址软件 > 比特币虚荣地址

比特币虚荣地址

imtoken靓号地址软件 2023-01-17 03:03:54

比特币靓号地址

比特币靓号地址

虚地址包含可读信息的有效比特币地址。例如,1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 包含 Base-58 字母 love。需要生成虚地址并针对数十亿个候选私钥进行测试,直到私钥可以生成具有所需模式的比特币地址。虽然有一些优化的虚荣生成算法,但该方法必须涉及随机选择私钥、生成公钥、生成比特币地址,并检查它是否匹配所需的虚荣模式,重复数十亿次,直到找到匹配项。

一旦找到与所需模式匹配的虚地址,所有者就可以使用来自该虚地址的私钥以与任何其他地址相同的方式使用比特币。虚荣地址并不比其他地址更安全。它们依赖与其他地址相同的 ECC 和 SHA。您无法比任何其他地址更容易获得具有虚荣图案的私钥。

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

4.5.3.1 生成虚地址

我们必须意识到,比特币是由 Base58 字母表中的简单符号表示的,地址非常重要。搜索以“1kids”开头的模式将找到从 1Kids111111111111111111111111111 到 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 的地址。在这些以“1kid”开头的地址范围内,大约有 58 个到第 29 个地址。表 4-11 显示了这些带有“1kids”前缀的地址。

表 4-11 “1Kids” 个性号码范围

来自

1孩子11111111111111111111111111

1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

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

表 4-12 个性号码出现频率(1KidsCharity)及生成所需时间

长度

免费领比特币的网站

地址前缀

概率

平均构建时间

1

1K

1/58

<1ms

2

1Ki

1/3,364

50 毫秒

3

1个孩子

1/(195*103)

免费领比特币的网站

< 2 秒

4

1个孩子

1/ (11*106)

1 分钟

5

1KidsC

1/(656*106)

1 小时

6

1KidsCh

1/(38*109)

2 天

7

免费领比特币的网站

1KidsCha

1/(2.2*1012)

3 月至 4 月

8

1KidsChar

1/(128*1012)

13-18

9

1KidsChari

1/(7*1015)

800 年

10

1KidsCharit

1/(400*1015)

免费领比特币的网站

46,000 年

11

1KidsCharity

1/(23*1018)

250 万年

如您所见,Eugenia 不会很快创建以“1KidsCharity”开头的虚荣地址,即使她有数千台计算机同时进行计算。每增加一个字符,计算难度就会增加 58 倍。超过 7 个字符的搜索模式通常需要找到专用硬件。输出免费领比特币的网站,例如具有多个图形处理单元 (GPU) 的用户定制桌面级设备。那些在比特币挖矿中通常不再有利可图的钻机被重新分配到寻找虚荣地址的任务。使用 GPU 系统搜索虚荣地址。数字比使用通用 CPU 快很多数量级。

另一种查找虚地址的方法是将工作外包给矿池中的虚矿工,例如虚矿池中的矿池。矿池是一项服务,它允许那些 GPU 硬件通过为他人寻找虚地址来赚取比特币对于小额账单,Eugenia 可以外包搜索模式以查找 7 个字符的虚荣地址的工作,并在数小时内而不是数月内获得结果免费领比特币的网站,而使用单个 CPU。

生成虚地址是一个蛮力过程:尝试随机密钥,检查生成的地址是否与所需的模式匹配,然后重复该过程,直到找到为止。示例 4-8 是一个使用 C++ 程序查找虚地址的虚荣矿工示例。此示例使用我们在第 56 页的“其他替代客户端、库、工具包”部分介绍的 libbitcoin 库。

示例 4-8 虚数挖掘程序

#include // The string we are searching forconst std::string search = "1kid";// Generate a random secret key. A random 32 bytes.bc::ec_secret random_secret(std::default_random_engine& engine); // Extract the Bitcoin address from an EC secret.std::string bitcoin_address(const bc::ec_secret& secret);// Case insensitive comparison with the search string.bool match_found(const std::string& address);int main() {    std::random_device random;     std::default_random_engine engine(random());     // Loop continuously...    while (true)     {        // Generate a random secret.        bc::ec_secret secret = random_secret(engine);         // Get the address.        std::string address = bitcoin_address(secret);         // Does it match our search string? (1kid)        if (match_found(address))         {            // Success!            std::cout << "Found vanity address! " << address << std::endl;             std::cout << "Secret: " << bc::encode_hex(secret) << std::endl; return 0;        }     }    // Should never reach here!    return 0; }bc::ec_secret random_secret(std::default_random_engine& engine){    // Create new secret...    bc::ec_secret secret;    // Iterate through every byte setting a random value... for (uint8_t& byte: secret)        byte = engine() % std::numeric_limits::max();     // Return result.    return secret;}std::string bitcoin_address(const bc::ec_secret& secret) {    // Convert secret to pubkey...    bc::ec_point pubkey = bc::secret_to_public_key(secret);     // Finally create address.    bc::payment_address payaddr; bc::set_public_key(payaddr, pubkey);    // Return encoded form.    return payaddr.encoded(); }bool match_found(const std::string& address) {    auto addr_it = address.begin();    // Loop through the search string comparing it to the lower case     // character of the supplied address.    for (auto it = search.begin(); it != search.end(); ++it, ++addr_it)        if (*it != std::tolower(*addr_it))             return false;    // Reached end of search string, so address matches.    return true;     }

示例程序需要使用C编译器链接libbitcoin库(该库需要提前安装到系统中)进行编译。直接执行 vanity-miner 的可执行文件(不带参数,参见示例 4-9),它会尝试与以“1kid”开头的比特币地址发生冲突。

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

$ # Compile the code with g++$ g++ -o vanity-miner vanity-miner.cpp $(pkg-config --cflags --libs libbitcoin) $ # Run the example$ ./vanity-minerFound vanity address! 1KiDzkG4MxmovZryZRj8tK81oQRhbZ46YTSecret: 57cc268a05f83a23ac9d930bc8565bac4e277055f4794cbd1a39e5e71c038f3f$ # Run it again for a different result$ ./vanity-minerFound vanity address! 1Kidxr3wsmMzzouwXibKfwTYs5Pau8TUFnSecret: 7f65bbbbe6d8caae74a0c6a0d2d7b5c6663d71b60337299a1a2cf34c04b2a623# Use "time" to see how long it takes to find a result$ time ./vanity-minerFound vanity address! 1KidPWhKgGRQWD5PP5TAnGfDyfWp5yceXMSecret: 2a802e7a53d8aa237cd059377b616d2bfcfa4b0140bc85fa008f2d3d4b225349real    0m8.868suser    0m8.828ssys     0m0.035s

如我们通过运行 Unix 命令时间测量的运行时所示,示例代码需要几秒钟才能找到与三字符“kid”模板匹配的结果。读者可以在源码中更改搜索模板,看看是四字符还是五字符的搜索模板需要多长时间!

免费领比特币的网站

4.5.3.2 虚地址安全

虚荣地址既可以增加也可以削弱安全措施,它们真的是双刃剑。当用于提高安全性时,唯一的地址使对手很难用自己的地址代替您的地址,以诱骗您的客户支付账单。不幸的是,虚地址也可能使任何人都难以创建类似于随机地址甚至另一个虚地址的地址,从而欺骗您的客户。

Eugenia 允许捐赠者向她宣布的随机生成的地址捐款(例如:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy)。或者她可以生成一个以“1Kids”开头的个性化地址,使其更加独特。

在这两种情况下,请使用单个固定地址(而不是为每次捐款使用单独的动态地址)其中一个风险是小偷可能会入侵您的网站并用他自己的网站替换您的网站,从而将捐款转移给他自己。如果您在其他地方发布您的捐赠地址,您的用户可以在付款前进行目视检查,以确保这与您在网站、邮件和传单上看到的地址相同。在随机地址 1j7mdg5rbqyuhenydx39wvwk7fslpeoxzy 的情况下,普通用户可能只检查“1j7mdg”的前几个字符,并且仅认为地址匹配。使用虚地址生成器,那些想通过替换相似地址来窃取的人可以快速生成匹配前几个字符的地址,如表4-13所示。

表 4-13 生成多个匹配随机地址的虚号

原始随机地址

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

4 位字符匹配

1J7md1QqU4LpctBetHS2ZoyLV5d6dShhEy

5 个字符匹配

1J7mdgYqyNd4ya3UEcq31Q7sqRMXw2XZ6n

6 位字符匹配

1J7mdg5WxGENmwyJP9xuGhG5KRzu99BBCX

虚荣地址会增加安全性吗?如果 Eugenia 生成一个 1Kids33q44erFfpeXrmDSz7zEqG2FesZEN 的虚荣地址,用户可能会在上面看到虚荣图案字母和一些字符,例如地址部分中注明了 1Kids33。这迫使攻击者生成匹配至少 6 个字母(比以前多 2 个字符)的虚荣地址,虚荣模式的成本是 Eugenia 的 3364 倍。本质上,Eugenia 的努力(或虚荣池)迫使攻击者生成更长的虚荣模式。如果 Eugenia 付费给矿池生成 8 个字符的虚名地址,攻击者将被迫生成 10 个字符,这将是一台个人计算机,即使是昂贵的自定义虚荣挖掘机或虚荣池也无法生成。 Eugenia 能负担得起的东西对攻击者来说变得无法承受,尤其是当欺诈的回报不足以支付生成虚地址的成本时。

比特币靓号地址