在Vanity比特币地址中:一种使CPU繁忙的新方法,用户“ ByteCoin”说他可以为人们创建和出售“ vanity”比特币地址(例如
1ByteCoinsUNJun4KL3HSt1NfFdXpzoRTy
)。此外,他说,他可以使用握手算法来执行此操作,而无需实际访问关联的私钥(因此也无法花费发送到该地址的比特币)。什么是创建虚荣比特币地址的快速算法?实际上可以安全地创建和出售它们吗?
#1 楼
我不相信有任何方法可以不进行迭代就生成虚荣散列。在基数58中,每个字母有$ \ log_2(58)\大约5.858 $位,因此固定8个字母平均需要$ 58 ^ 8/2 = 2 ^ {\ log_2(58)·8} / 2 \大约2 ^ {46} $次迭代。请注意,比特币地址始终按惯例以1开头(这来自版本字段),并且基数58表示形式中的下一个字符通常位于“ 23456789ABCDEFGHJKLMNPQR”(不是完整的58个字符集)之中,这使尝试次数减半再一次(如果您希望的起始字符位于此集合中,否则它将变为不可能)。如果允许虚荣字符串显示在哈希表中的任何位置,则可以将该数字再次除以25,从而导致$ 2 ^ {40.5} $迭代(平均)(这也是相当好的可并行性)。另外,他给出的实际示例在虚荣的“ ByteCoins”部分中用“ s”而不是“ i”,因此可能性更大(即所需时间更短)。 >
但是,您可以安全地执行此操作(即在服务无法访问您的私钥的情况下):
让用户生成私钥$ a $并提交相应的公共键,$ a·B $(其中,$ B $是组的基点)。然后该服务可以生成公钥,如$ a·B + x·B $,其中$ x $递增以生成不同的公钥。
实际上,如果您有$ a·B + x· B $,然后$ a·B +(x + 1)·B =(a·B + x·B)+ B $,即,您只需要一个EC点加法(基点的加法),并且每个哈希都需要必要的哈希尝试。
然后,通过告诉用户x,用户具有私钥$ a + x $和公钥$(a + x)·B $和$ H((a + x)· B)$具有必需的属性(如果服务已完成工作)。
评论
$ \ begingroup $
如果您可以在原图像中找到需要调整的内容,而无需在散列之前对其执行其他数学运算,则可以大大提高效率。但是,如果没有确切的地址生成规范,很难说是否还有其他可以调整的字段或格式。
$ \ endgroup $
–PulpSpy
2011年7月13日在20:37
$ \ begingroup $
我现在看到的是规范的链接,尽管不是ECDSA密钥的确切格式的规范。地址包含“版本”字段。如果客户端未检查或使用它,则可以使用哈希值(而不是点乘法,加法,和哈希)。
$ \ endgroup $
–PulpSpy
2011年7月13日在20:44
评论
文章首先说地址只是哈希的输出,但随后又说它们包括一些错误纠正,这意味着它们不仅是哈希的输出?我现在看到它是addr =(ver || RIPEMD-160(SHA-256(key)))||(SHA-256(SHA-256((ver || RIPEMD-160(SHA-256(key))) ))))其中ver是版本,而key是公钥,第二个组件仅是前4个字节。
感谢@pulpspy完成说明。如果您希望能够在校验码部分中找到虚荣,这将变得更加昂贵-一个地址有4个散列...