当前位置:主页 > 区块链 > 区块链技术 > 区块链钱包私钥碰撞概率

关于区块链钱包私钥碰撞概率计算分析

2024-03-16 00:55:38 | 来源: | 作者:佚名
最近看到有人说通过碰撞区块链钱包私钥而一夜暴富,感兴趣所以了解了一点关于区块链钱包的知识

各种货币的钱包地址是唯一的吗?

先说结论:一种算法内,钱包地址是唯一的。两种不同的算法可以用不同的私钥生同相同的公钥。但是两者之间毫无关系。所以,另一种币的钱包地址和你的ustd钱包地址一致,基本上也没什么关系。但是,如果你说的另一种币加密算法和ustd是一致的,那么就意唯着你的私钥也是他的私钥,你们双方都可以操作对方的账户。这就意味着你们两人在生成私钥的时候,生成了一个一模一样的,嗯~~,这种概率无限趋近于零。

早在区块链出现的时候,大家就知道一种破解钱包的方法,就是私钥碰撞。你可以拿一台电脑,一直生成钱包地址,万一生成出了一个和现在公链上已经存在的钱包地址,那就意味着碰撞成功,万一这个钱包里面有很多很多的数字货币,那你就发财了。碰撞成功概率有多少呢?以比特币为例:

已知比特币私钥总数为2^256个。假设地球74亿人每人拥有100个有余额的私钥,那么随机生成一个私钥,刚好碰撞成功的概率是6.42*(10^-68),可以忽略不计~

最后补充一个基础知识:

所有区块链的钱包的地址都是非对称加密算法的公钥,与之对应的是一个私钥。简单来说,就是一对密码,他们通过一个算法,可以相互解密对方加密的信息。然后把其中一个密码公布出去(放在公链上)让谁都能得到,撑握私钥的你就可以发起交易了,你发起的交易任何人拿公钥都可以解密验证,所以可以证明这个交易是真实的体现了你的意愿。

公钥和私钥的生成靠的是随机算法,因为生成范围无限大,所以虽然理论有可能生成出相同的公私钥,但是概率无限趋近于零。

什么是区块链钱包

这是一个储存加密货币资产的工具,可以理解为银行账户。区块链钱包可以让用户查看余额、发送交易、接收资金等等。更具体地说,加密货币钱包本身不持有任何加密货币,它们持有的是加密货币的私钥。

什么是私钥

私钥就像是你的银行卡密码,它是由大小写字母和数字组成的编码,长度与区块链类型有关。你可以通过私钥推导出公钥。

什么是公钥

公钥可以对外公开,人们可以向你的公钥转账,就好比别人可以向你的银行账户打款一样。

私钥碰撞

既然每一个私钥都对应了一个钱包账户,那我们能不能通过随机生成私钥,来碰撞到有存储加密货币的钱包呢?

说干就干,咱们随便写一个多线程随机生成私钥并检查余额的程序来试试

from web3 import Web3
from loguru import logger
import binascii, os
import threading
import time
def generate_private_key():
    return binascii.b2a_hex(os.urandom(32)).decode('utf8')
# 初始化 Web3
# 这里用alechemy提供的接口来连接Ethereum 节点
http_provider = Web3.HTTPProvider('https://eth-mainnet.g.alchemy.com/v2/YOUR-PROJECT-ID')
web3 = Web3(http_provider)
# ABI
abi = """
[
    {
        "constant": true,
        "name": "balanceOf",
        "outputs": [{"name": "", "type": "uint256", "value": "2000000000"}],
        "inputs": [{"name": "_owner", "type": "address"}],
        "anonymous": false,
        "type": "function"
    }
]
"""
# 智能合同地址和对应的单位
contracts_info = {
    'USDT': {
        'address': "0xdAC17F958D2ee523a2206206994597C13D831ec7",
        'decimal': 10**6
    },
    'USDC': {
        'address': "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        'decimal': 10**6
    },
    'Dfyn': {
        'address': "0x9695e0114e12c0d3a3636fab5a18e6b737529023",
        'decimal': 10**18
    },
    'BigTime': {
        'address': "0x64bc2ca1be492be7185faa2c8835d9b824c8a194",
        'decimal': 10**18
    },
    'MANA': {
        'address': "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942",
        'decimal': 10**18
    }
}
# 存有所有的合约实例
contracts = {}
# 创建所有的合约实例
for token, contract_info in contracts_info.items():
    contracts[token] = {
        'contract': web3.eth.contract(address=web3.to_checksum_address(contract_info['address']), abi=abi),
        'decimal': contract_info['decimal']
    }
try:
    latest_block = web3.eth.block_number
    logger.success(f'Web3 成功连接!最新的区块编号是: {latest_block}')
except Exception as e:
    logger.error('Web3连接失败!')
    logger.error(str(e))
# 创建一个线程锁
lock = threading.Lock()
def task():
    while True:
        try:
            myPrivateKey = generate_private_key()
            myAccount = web3.eth.account.from_key(myPrivateKey)
            wallet_address = web3.to_checksum_address(myAccount.address)
            # 请求会继续尝试直到成功
            while True:
                try:
                    # 查询ETH余额
                    balance_wei = web3.eth.get_balance(wallet_address)
                    balance_eth = web3.from_wei(balance_wei, 'ether')
                    break  # 如果请求成功则跳出循环
                except Exception as e:
                    logger.error('Failed to query ETH balance. Retrying...')
                    time.sleep(0.5)  # 暂停0.5秒再重试
            # 查询 Token 余额
            balances = dict()
            non_zero_balance = False
            for token, contract_info in contracts.items():
                contract = contract_info['contract']
                decimal = contract_info['decimal']
                # 请求会继续尝试直到成功
                while True:
                    try:
                        balance = contract.functions.balanceOf(wallet_address).call() / decimal
                        break  # 如果请求成功则跳出循环
                    except Exception as e:
                        logger.error(f'Failed to query {token} balance. Retrying...')
                        time.sleep(0.5)  # 暂停0.5秒再重试
                balances[token] = balance
                # 检查余额是否大于0
                if balance > 0:
                    non_zero_balance = True
            # 打印所有余额
            logger.info(f'PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]))
            # 如果余额大于0,加锁向文件追加数据
            if non_zero_balance:
                with lock:
                    logger.success(f'发现非空钱包,PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]))
                    with open('key.txt', 'a') as f:
                        f.write(f'PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]) + '\n')
        except Exception as e:
            logger.error('Error occurred. Retrying...')
            continue
def main():
    # 线程数量
    logger.info('请输入线程数:')
    num_threads = int(input())
    for _ in range(num_threads):
        t = threading.Thread(target=task)
        t.start()
if __name__ == '__main__':
    main()

程序运行截图

这个程序在开200个线程的情况下,一台服务器运行24小时大概能够查询上千万个私钥对应的钱包是否有以上几种加密货币。

因为是程序是联网查询的,所以速度上会稍微慢一些。如果想要优化查询速度的话,可以把所有有过交易记录的钱包地址都记录下来,然后拿私钥计算出来的钱包地址直接去和记录的钱包地址做比对(空间换时间),这样可以节省掉联网查询的耗时。

概率计算

我们假设全世界80亿人,每个人有2个区块链钱包,我们的程序一分钟能够计算1000万个私钥对应的钱包里是否有加密货币,我们放在服务器上计算一年,碰撞到持有加密货币的钱包地址的概率是多少呢?

区块链的钱包私钥通常是256位的,以十六进制来表示则为64个字符(一位十六进制 = 4位二进制),所以有效的私钥数量为 16^{64} ,接近 10^{77} 。

全世界80亿人( 8*10^{9} ),每个人有2个钱包里面有加密货币,所以总共有 1.6*10^{10} 个钱包。所以有加密货币钱包的概率是 1.6*10^{10}/10^{77} = 1.6*10^{-67} 。

程序每分钟能生成1000万( 10^{7} )个私钥,一小时就是( 60*10^{7} ),一年(假设为365天),就是 365*24*60*10^{7}=5.256*10^{12}

所以,一年的时间内,碰到一个持有加密货币的钱包地址的概率为 5.256*10^{12}*1.6*10^{-67}=8.4096*10^{-55}

这个概率是个什么概念呢?

双色球一等奖(猜中6个红球号码,以及蓝球的号码),中奖概率为1/17721088,约等于 5.64325*10^{-8} 。

如果我们将这两个概率进行比较,可以得到连续中双色球的次数为log( lg8.4096*10^{-55}/lg5.64325*10^{-8}\approx7.5 ^-51)。

也就是说碰撞到一个持有加密货币的钱包地址相当于连续7.5次中双色球一等奖

这就是为什么人们称基于私钥的加密为安全的原因。私钥空间太大了,即使使用极其强大的计算能力,也不可能在有限的时间内通过生成检查所有可能的私钥的方法找到特定的私钥。

多签钱包

当你碰撞到了一个持有大量加密货币的钱包,其还有可能是多签钱包(Multisignature Wallet),一笔交易需要多个私钥的签名才能完成。即使你有一个私钥,也无法进行转账或交易。

在线手动碰撞

这是一个在线手动进行私钥碰撞的网页,可以根据私钥计算出公钥,也可以生成随机的公私钥对,并且点击链接能够直接跳转到 Etherscan 检查地址对应的余额。

地址:http://eag.smallyu.net

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!

你可能感兴趣的文章

更多

热门币种

  • 币名
    最新价格
    24H涨幅
  • bitcoin BTC 比特币

    BTC

    比特币

    $ 67099.19¥ 462038.31
    +0.51%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 2049.85¥ 14115.06
    -0.21%
  • tether USDT 泰达币

    USDT

    泰达币

    $ 0.9998¥ 6.8845
    -0.01%
  • ripple XRP 瑞波币

    XRP

    瑞波币

    $ 1.3105¥ 9.0239
    -0.83%
  • binance-coin BNB 币安币

    BNB

    币安币

    $ 589.43¥ 4058.75
    +0.67%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0007¥ 6.8907
    +0.04%
  • solana SOL Solana

    SOL

    Solana

    $ 80.0922¥ 551.5
    +0.71%
  • tron TRX 波场

    TRX

    波场

    $ 0.3169¥ 2.1821
    +1.02%
  • dogecoin DOGE 狗狗币

    DOGE

    狗狗币

    $ 0.090943¥ 0.6262
    -0.53%
  • leotoken LEO UNUS SED LEO

    LEO

    UNUS SED LEO

    $ 10.0249¥ 69.0304
    -0.19%

币圈快讯

  • 特朗普:纽约时报信誉扫地把北约称为“北美条约组织”

    2026-04-04 21:38
    4月4日,特朗普在社交媒体上发文称:失败的《纽约时报》信誉扫地,并不断对你们喜爱的总统——我——发动虚假新闻攻击,这已导致其发行量大幅下滑。他们竟把我们严重削弱且极不可靠的“伙伴”北约称为“北美条约组织”。正确名称是北大西洋公约组织——一个非常有意思的错误!《纽约时报》的招聘和教育标准已经大幅下降。让“一切适合刊登的新闻”回归吧,让美国再次伟大!
  • 美参议院银行委员会据悉定于4月16日审议沃什美联储主席提名

    2026-04-04 21:33
    4月4日,一名知情人士向CNBC表示,美国参议院银行委员会将于4月16日举行听证会,审议凯文·沃什出任美联储主席的提名。围绕美联储的另一项刑事调查仍在进行,正在审查现任主席鲍威尔是否就美联储办公楼昂贵翻修的情况向国会作出虚假陈述。而沃什的提名程序仍在推进,这使特朗普政府推动的两项并行进程可能发生冲突。银行委员会成员ThomTillis已经表示在调查结束前不会投票确认沃什,这意味着特朗普无法同时推进两项进程,但通过继续推进听证会,特朗普显然仍在尝试实现这一目标。参议院银行委员会尚未将听证会列入公开日程。
  • 美参议院银行委员会拟定于4月16日审议沃什美联储主席提名

    2026-04-04 21:28
    一名知情人士向CNBC表示,美国参议院银行委员会将于4月16日举行听证会,审议凯文·沃什出任美联储主席的提名。 围绕美联储的另一项刑事调查仍在进行,正在审查现任主席鲍威尔是否就美联储办公楼昂贵翻修的情况向国会作出虚假陈述。而沃什的提名程序仍在推进,这使特朗普政府推动的两项并行进程可能发生冲突。 银行委员会成员ThomTillis已经表示在调查结束前不会投票确认沃什,这意味着特朗普无法同时推进两项进程,但通过继续推进听证会,特朗普显然仍在尝试实现这一目标。参议院银行委员会尚未将听证会列入公开日程。
  • F2Pool联创王纯:BTC协议升级不应出现政治性妥协

    2026-04-04 21:28
    F2Pool联创王纯在X平台发文表示,比特币协议升级不应出现类似美国政客们采用“捆绑法案”强行推进“一些必须通过但不受欢迎的条款”的做法,这也是其反对BIP-110及BIP-54的重要原因。在回应使用BIP-54的任何修复程序时是否遇到问题时,王纯补充表示,时间扭曲攻击(Timewarp)问题由来已久,对矿工来说并没有显著优势,因为无法预测下一个区块的挖矿者是谁,唯一的实际用途是干扰某些山寨币,由于对比特币矿工几乎没有实际好处,因此没有迫切需要对其进行修改;此外,区块验证效率已因libsecp256k1及硬件升级显著提升,无需协议层调整;而“伪造已确认交易”本质依赖破解双重SHA256碰撞,一旦成立将意味着比特币核心安全已被攻破。王纯补充称,上述问题均不足以推动协议修改,目前仅“重复交易(duplicatetransactions)”问题具备一定修复价值,可能是少数值得实施的改动。
  • 1829.86枚BTC从Hyperunit转出价值约283.8万美元

    2026-04-04 21:12
    据Arkham数据,在21:04,1829.86枚BTC(价值约283.8万美元)从Hyperunit转出至Wintermute。
  • 查看更多