如何生成所有可能的私钥?

时间:2018-04-16 09:52:40

标签: c# asp.net bitcoin

我想制作像ethersecret.org这样的网站

如何从头到尾生成所有可能的私钥。 (0-9,A-F)

我尝试了几种方法,但我不能这样做。

然后我将这个私钥转换为公共地址。 Mssql数据库足够用于此记录吗?

2 个答案:

答案 0 :(得分:4)

比特币(标签)私钥是256位;这意味着有115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936个不同的可能值。这就是你的行数。

不,您无法存储所有可能的值。

对于背景,构成我们星球的原子数是

100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000

所以...你需要存储大约1.15千万亿行每个原子来实现这一目标。

答案 1 :(得分:3)

你链接的网站基本上是个玩笑。有2 ^ 256个可能的私钥,当然你不能存储它们,但是你可以列出"列出"它们都是一页一页而不存储。

假设您有1.000.000个数字(从1到百万),并且您希望列出页面大小为50的数字。您会怎么做?一个选项是将它们存储在数据库中,但没有理由,因为您可以使用以下内容计算在给定页面(pageNumber)上显示的数字:

var pageNumber = 1;
int pageSize = 50;
var first = pageSize * (pageNumber - 1) + 1; // 1-based, not 0-based
for (int i = first; i < first + pageSize; i++)
{
    Console.WriteLine(i);
}

这是该网站的作用。您选择一个页面,它会列出有限数量(25个)的连续&#34;私钥&#34;为此&#34;页面&#34;。对于每个这样的密钥,它计算公钥(地址)并进行余额查询。

请注意,要在C#中处理如此大的数字(最多2 ^ 256),intlong类型是不够的,但有BigInteger类型,这是有能力的这样做。

以下是如何为页码4364908475194633198041869980357565399892975134476500473255880896656920733874

提供相同的(针对上述网站)结果
using System;
using System.Numerics;

namespace ConsoleApp8 {
    class Program {
        static void Main(string[] args) {
            var pageNumber = BigInteger.Parse("4364908475194633198041869980357565399892975134476500473255880896656920733874");            
            const int pageSize = 25;
            var first = pageSize * (pageNumber - 1) + 1; // 1-based, not 0-based
            for (BigInteger i = first; i < first + pageSize; i++)
            {
                Console.WriteLine(i.ToString("x"));
            }
        }
    }
}