主页 > imtoken最新版本下载 > 有没有可能两个ETH私钥对应同一个地址

有没有可能两个ETH私钥对应同一个地址

imtoken最新版本下载 2023-01-18 10:03:55

个人总结

生成重复私钥和生成同一个地址对应的私钥是两个问题。 后者可以通过限制私钥生成的范围来避免,但前者会增加出现的概率(从1/2^256来避免后者)到1/某个极限值)。

从这个问题来看,至少go-ethereum限制了私钥生成的范围,保证没有两个私钥对应同一个公钥,即不超过椭圆曲线的周期范围(理论上还是不能避免生成相同私钥的两种可能性)。

但是,仍然有可能在生成新的私钥时,全网都已经生成了私钥。 虽然这很困难,但不能承受区块链的完全张扬,可能会有无聊和恶意的人。 不断碰撞私钥。 虽然说私钥机制被推翻的那一天,密码学和区块链必然会产生更大的影响,但至少目前来看,这件事只是理论上可行。

翻开最新的go-ethereum源码,可以看到私钥是这样创建的:

privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), reader)

即调用crypto/ecdsa库的GenerateKey方法,给出的范围为crypto.S256()。 这个值可以在 curve.go 中找到:

以太坊私钥怎么用_用手提挖以太坊_以太坊和以太币有什么区别

var theCurve = new(BitCurve)
func init() {
	// See SEC 2 section 2.7.1
	// curve parameters taken from:
	// http://www.secg.org/collateral/sec2_final.pdf
	theCurve.P = math.MustParseBig256("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F")
	theCurve.N = math.MustParseBig256("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141")

以太坊和以太币有什么区别_以太坊私钥怎么用_用手提挖以太坊

theCurve.B = math.MustParseBig256("0x0000000000000000000000000000000000000000000000000000000000000007") theCurve.Gx = math.MustParseBig256("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798") theCurve.Gy = math.MustParseBig256("0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8") theCurve.BitSize = 256 } // S256 returns a BitCurve which implements secp256k1. func S256() *BitCurve {

以太坊和以太币有什么区别_以太坊私钥怎么用_用手提挖以太坊

return theCurve }

并且在crypto.go中定义了如下变量来限制范围以太坊私钥怎么用,超出这个范围的视为非法私钥:

var (
	secp256k1_N, _  = new(big.Int).SetString("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16)
	secp256k1_halfN = new(big.Int).Div(secp256k1_N, big.NewInt(2))
)

以太坊和以太币有什么区别_以太坊私钥怎么用_用手提挖以太坊

不过回到作者的初衷,使用neon-js中的私钥生成方式创建NEO私钥,本产品直接使用js中的encrypt.getRandomValues,其随机性和双重私钥(对应同一个地址)防御能力? 答案似乎是跟踪 NEO-CLI 自己的私钥生成算法。 如果我没记错的话,就是下面这一段:

public WalletAccount CreateAccount()
{
    byte[] privateKey = new byte[32];
    using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
    {
        rng.GetBytes(privateKey);

以太坊私钥怎么用_用手提挖以太坊_以太坊和以太币有什么区别

} WalletAccount account = CreateAccount(privateKey); Array.Clear(privateKey, 0, privateKey.Length); return account; }

仅由C#自带的库生成,没有范围限制。 和neon-js一样以太坊私钥怎么用,把随机性的压力交给老大。 这样一来,不知道是好消息还是坏消息。 私钥可以用neon-js创建,反正不比neo core的创建方法差。

提出另一个大胆的想法,如果你召集10000个或更多的志愿者,每天不挖矿,每个人的整个超级计算机将碰撞一定范围的ETH私钥(这可以算是极难挖矿),协商一下,如果有人遇到大额充值地址,平分。 从哲学的角度来看,这是在挑战区块链的核心信念。