比特币密钥是随机生成的,两个人生成的钱包会不会相同?
2024-04-25 11:35:12
• 币圈观点
• 阅读量 156
如果不断地生成比特币地址,会不会碰撞到别人的比特币地址? 也许你也有过这样的想法,或者有过这样担心: 别人生成的比特币地址,会不会和我的一样?如果相同,会怎么样? 如果两个比特币地址生成相同,它就是一个地址。也就是如果生成的和别人一样的 比特币地址,那么你可以花费别人的比特币了,因为两人共同持有的是同一个钱包。 比特币是基于密码学做安全保障的,而比特币的地址和私钥,分别对 应着密码学的公钥和私钥。 在中心系统中,比如银行卡账号,它是由银行提供的,它的唯一性由银行做了保障。而比特币的地址和私钥( 在密码学中,本质是一对密钥对) ,没有一个中心担保唯一性,它却是随机生成的。 在谈论这个之前,我们先看另一个问题——“生日悖论”的问题: “一个班级中,需要多少人,当中两人同一天生日的概率才会过半?答案是23人。而对于60人以上的班级,存在两人同生日概率大于99%。” 似乎有点出乎意料,如果不了解这个问题或许会说“不会吧,那么少?!” 不考虑闰年的情况,我们看看人数为n的 人群中,没有人生日相同的概率P(n)情况。 2个人的情况,由于一人的生日是定在某 1天,另一个人不能和他相同,所以可选的日期只有365-1=364了,也就是364/365,即:P(2) = 364/365; 同理推得,3人时候,第3个人可选日期只可以为:365-2=363, 所以有:P(3) = (364/365) * (363/365); 同理推得,4人时候,P(4) = (364/365) * (363/365) * (362/365);
所以,n < 365,P(n) =
上面是“不存在有生日相同” 的概率,用1减去之,也就是:可能存在有生日相同的概率 : def P (n) : if n >= 366 : return 0 result = 1 for i in range(1 , n): result *= (365 - i) / 365 return result for n in [10 , 20 , 30 , 50 , 100 , 200 ]: p = P(n) print(n, "个人,存在相同生日的概率为:" ,1 -p) 我们看看,n为不同数字时候,存在生日相同的概率大情况:
注: 当n = 200,存在相同生日概率:
99.9999999999999999999999999998%
想不到吧,随着n增加,存在相同生日的概率迅速接近1。 太爽了,是不是我们不断地生成比特币地址,也可以碰到之前有人生成过的比特币地址? 这样,就可以花费别人的比特币了。 如 果可行,这是一个何等刺激的事情,比挖矿还好玩了。
前面说过,比特币是基于密码学做安全保障的,比特币地址的唯一性,本质是个数学问题的讨论。 比特币的公钥也就是地址,私钥才可以花费该地址的币,密码学中它们是成对生成的,在比特币系统使用的椭圆算法特点,私钥可以推导公钥,但反过来不行。这里就仅拿公钥也就是地址做随机问题的讨论了。 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 其实它原始数据是一个256位的二进制数字,为了显示的便利性,上面是经过某种编码后的样式。 地址空间是256个bit的数字,如果我们把所有的比特币地址排在一起,他们是这样的: 一共有多少个地址?——2^256个,约等于 1.158 * 10^77,如果没有概念,宇宙的 原子数 被估计含有10^80个,银河系中的原子数量为1.201×10^68。它比银河中原子数还大9个数量级。 生成一对比特币地址和私钥的随 机性 ,就等价于一个256个长度的“0、1”串的随机性了。 如何生成这样的随机数字 ? 是这样的......(省略了1万字),通俗的比喻,就是抛256次硬币,用“1、0”表示 正反面,结果记录下来,这串数字就是你的比特币钱包了 , 两个地址生成一样的概率(两人抛256次硬币抛出结果一样)为1/ 1.158 * 10^77,这 等价于,两人在银河中随机抽取原子,却抽到相同一个原子的事件了。 说了两人碰撞情况,接着看如果很多人同时碰撞情况会是如何? 按照前面的推导,n 个人,生成比特币地址存在相同的概率p(n): 如果全人类70亿人每人生成一个比特币地址~算了,每人10000个比特币地址吧,随机生成70万亿个比特币地址,存在相同的概率有多大? p(n) = 1 - [(2 ^ 256 - 1) * (2 ^ 256 - 3) * …… (2 ^ 256 - n)] / [(2 ^ 256) ** n] < 1 - [(2 ^ 256 - n) ** n] / [(2 ^ 256) ** n] 省去复杂的推算过程,直接给结果吧: p(70万亿) << 1 / (10^47) 。 也就是全球70亿人每人生成10000个比特币地址,存在两个相同地址的概率,小于一千万亿亿亿亿亿分之一 ( 数的很累,不知道有没有数错几个亿,反正知道是很多亿就是) 。 顺便说一下,买彩票中一等奖概率竟有1772万分之一,也就是中一等奖概率是前面的那个数字的不知道几个亿亿亿倍。 这样看来还是不去碰撞别人的钱包地址,买彩票更合算。 为什么前面的生日问题,概率那么大,而钱包碰撞概率那么小? 因为生日问题,日期空间只有365(或者366)个,而密钥地址空间2^256,这个数字大到地球人口和算力在它面前都显得微不足道。 综上,靠碰撞到别人的比特币钱包,是不切实的。历史上有出现比特币被盗事件,但都是钱包泄漏导致的。