【加密社】私钥碰撞器原理及工作展示

加密社

在区块链和加密货币系统中,私钥是保护用户资产安全的核心。
私钥用于生成公钥和地址,并且是唯一能够签署交易的密钥。私钥的安全性直接关系到用户的资金安全。本文将从技术角度探讨私钥碰撞的可能性、风险以及如何防范。

点击上方蓝字关注我们

新来的朋友记得关注并设为星标才能第一时间收到每天的文章推送

  • 什么是私钥?

动图封面

在比特币和其他基于椭圆曲线密码学(ECC)的系统中,私钥通常是一个256位的整数。私钥 dd 用于生成对应的公钥 QQ,公式如下:

其中 GG 是椭圆曲线上的一个基点(生成元),dd 是私钥。

公钥 QQ 可以进一步转换为地址。对于比特币,地址的生成过程包括:

  1. 计算公钥哈希:使用SHA-256和RIPEMD-160对公钥进行两次哈希运算。

2.添加版本字节并进行Base58Check编码。

私钥碰撞的概念

私钥碰撞是指两个不同的私钥生成了相同的公钥或地址的情况。这种情况理论上可能发生,但实际发生的概率极低。

对于256位的私钥空间来说,可能的私钥数量是2的256次方,这是一个天文数字,比宇宙中的原子数量还要多得多。

理论上的可能性

生日悖论

虽然私钥碰撞的概率非常低,但我们可以借用“生日悖论”来理解这种小概率事件。生日悖论表明,在一个房间里有23个人时,至少两个人生日相同的概率超过50%。

然而,私钥空间远远大于这个规模,因此即使考虑生日悖论,私钥碰撞的实际发生率仍然极其微小。

量子计算威胁

随着量子计算技术的发展,传统加密算法可能会面临新的挑战。量子计算机理论上可以通过Shor算法在多项式时间内破ECC等公钥密码体制,从而找到私钥。

但这仍然是一个未来的问题,目前的量子计算机还不足以对现有的密码体系构成实质性威胁。

实际风险

尽管私钥碰撞的理论可能性极低,但在实践中,以下几种情况可能导致类似的风险:

  1. 弱随机数生成器:如果使用的随机数生成器不安全或被恶意篡改,可能会生成重复或可预测的私钥。
  2. 硬件故障:某些硬件设备可能存在缺陷,导致生成的私钥不是完全随机的。
  3. 软件漏洞:乾包软件或其他相关工具中的漏洞可能导致私钥生成过程出现错误。

防范措施

为了防止私钥碰撞及相关风险,可以采取以下措施:

  1. 使用高质量的随机数生成器:确保使用的随机数生成器符合密码学安全标准,如FIPS 140-2认证的CSPRNG。以下是一个使用Python的示例代码,展示如何生成一个安全的私钥:
import os
import hashlib

def generate_private_key():
    # 生成256位的随机数
    private_key = os.urandom(32)
    return int.from_bytes(private_key, byteorder='big')

# 生成一个私钥
private_key = generate_private_key()
print(f"Generated Private Key: {private_key}")
  • 概率解释&工具展示

动图封面

椭圆曲线密码学模型

私钥碰撞在理论上存在,但在实际应用中极为罕见

但是仍挡不住技术爱好者想要在里面试试自己的运气。

初版的私钥碰撞是根据RPC节点去无线循环匹配地址,可以多开程序,如图:

干货来咯~!私钥碰撞器,需要拿走

但是后来和几个技术圈的朋友讨论后,觉得这样的想法是比较天真的,这样的概率来跑的话,除非运气逆天,否则真的很难中奖。

于是我把目光转移到了助记词上,了解技术的朋友都知道。

大部分助记词(种子短语)都是通过BIP39标准规则生成的,目的是生成的一种人类可读的、易于记忆的单词序列,用于恢复和备份加密货币乾包。

BIP-39定义了一种从随机数生成助记词的方法,并且这些助记词可以用来重新生成私钥。本文将详细解释助记词与私钥之间的关系,以及它们在加密货币乾包中的应用。

BIP-39定义了一个包含2048个单词的词典,每个单词对应一个11位的索引。

首先,需要生成一个随机数,这个随机数通常是128到256位的二进制数据。这个随机数被称为“熵”。

import os
import hashlib

# 生成128位的熵
entropy = os.urandom(16)  # 16 bytes = 128 bits
print(f"Entropy: {entropy.hex()}")

为了确保助记词的正确性,需要在熵后面添加一个校验码。校验码是通过SHA-256哈希函数对熵进行哈希运算后取前几位得到的。

def add_checksum(entropy):
    checksum_length = len(entropy) // 32  # 1 bit per 32 bits of entropy
    hash = hashlib.sha256(entropy).hexdigest()
    checksum = int(hash, 16) >> (256 - checksum_length)
    return (int.from_bytes(entropy, 'big') << checksum_length) | checksum

# 添加校验码
checksummed_entropy = add_checksum(entropy)
print(f"Checksummed Entropy: {checksummed_entropy:02x}")

将带有校验码的熵转换为助记词。BIP-39定义了一个包含2048个单词的词典,每个单词对应一个11位的索引。

def entropy_to_mnemonic(entropy):
    wordlist = open('bip39_wordlist.txt', 'r').read().splitlines()
    checksum_length = len(entropy) // 32
    hash = hashlib.sha256(entropy).hexdigest()
    checksum = int(hash, 16) >> (256 - checksum_length)
    combined = (int.from_bytes(entropy, 'big') << checksum_length) | checksum
    mnemonic = [wordlist[(combined >> (11 * i)) & 0x7FF] for i in range(len(entropy) * 8 + checksum_length // 11)]
    return ' '.join(mnemonic)

# 生成助记词
mnemonic = entropy_to_mnemonic(entropy)
print(f"Mnemonic: {mnemonic}")

种子可以用来生成一个主私钥(Master Private Key),这是通过BIP-32(Hierarchical Deterministic Wallets)标准实现的。BIP-32定义了一种从种子生成一系列派生私钥的方法。

from bip_utils import Bip32, Bip39SeedGenerator, Bip39WordsNum

# 生成主私钥
seed_generator = Bip39SeedGenerator(mnemonic)
seed = seed_generator.Generate()
bip32_ctx = Bip32.FromSeed(seed)
master_private_key = bip32_ctx.PrivateKey().Raw().ToBytes()

print(f"Master Private Key: {master_private_key.hex()}")

通过BIP-32,还可以从主私钥派生出多个子私钥

展示:(这里用的是浏览器脚本+自动化测试脚本实现的)

后来呢,为了更加简化这种步骤,(省却从中调起浏览器啥啥的之类的,更加优化策略)

改成了以下三个步骤:

1.生成助记词

2.查询交易次数(因为如果这个私钥地址交易次数>=1,那么就可以认为是有效乾包地址)

3.查询到后利用WxPusher推送至对应的用户(代码内设置,可开源)

这样的步骤下来就非常大大的提高了效率。

如图:

但是同时的话,如果你的机器够好的话,原先的那种RPC的私钥碰撞的也可以同时挂着,不影响的。

动图封面

● 【加密社】Web3加密市场最全免费180个工具类集合(建议收藏)

● 宏观看待目前世界经济格局(大A,币圈,美股)等市场

● 币圈加密社群 含TG机器人监控咨询

● 【加密社】深度解析白皮书 比特币海量数据问题解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加密社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值