区块链芝士丨私钥是什么?(2)
私钥、公钥和地址
由于私钥必须保密,我们还需要一种机制来标记发帐的目的地。因此,所有区块链都引入了地址(根据私钥计算出的一串独一无二的数字)这一概念。地址就是密码学资产的存储位置,(如有需要)可以分享给任何人,这样他们就能给你转账(也能知道你的密码学资产余额)。
区块链地址是通过公钥创建的,以确保你是这个地址的所有者。再往回推,公钥是通过私钥生成的。这个过程是单向的,也就是说你可以通过私钥计算出账户地址,但是不能通过账户地址倒推计算出私钥(哪怕是您自己,也做不到)。
私钥可以推出公钥,公钥可以推出区块链地址。但是,区块链地址无法用来推出公钥,公钥也无法用来推出私钥。
这一单向过程是通过密码学陷门函数(cryptographic trapdoor function)实现的。陷门函数是一种单向函数,一个输入值只能导致唯一的输出值,但是不能根据输出值倒推原始的输入值。不同的区块链生态系统采用不同的单向函数。例如,最流行的区块链系统使用基于椭圆曲线的代数结构来生成公钥。无论这些代数结构具备哪些特征,其结果始终是确定的:公钥是与私钥一一对应的,同一个私钥永远只能生成同样的公钥。
虽然比特币或以太坊等流行的区块链使用 ECDSA 算法,用椭圆曲线 secp256k1上的固定点乘以私钥,即得出公钥。其它区块链项目也采用类似的方法。例如,门罗使用的是 EdDSA 算法和 Curve25519 曲线,Polkadot 和 Substrate 使用的是 sr25519 算法和 Ed25519曲线。所有这些区块链都基于 1 到2256 - 1 范围内的私钥生成公钥。
区块链地址也是用单向函数计算出来的,用的就是所谓的哈希函数。比特币和以太坊地址都是在公钥的基础上通过一个或多个密码学加强型哈希函数创建的,只不过不同的区块链会采用不同的算法。鉴于这些哈希函数的运作方式,你绝对可以相信你的公钥和私钥对应的区块链地址是唯一的。
以太坊账户是公钥的 Keccak-256 哈希值,但是只保留计算结果最右边的 20 个字节。比特币私钥使用 SHA-256 和 RIPEMD-160,Polkadot 和 ZCash 使用 Blake2b。所有这些哈希函数都是抗碰撞的,因此两个公钥生成同一个账户地址的可能性很低,而且保证了用地址反推私钥的唯一方式是经济效率极低的暴力破解。我们并不能保证这些哈希函数不会被破解,但是迄今为止,还没有哪个区块链使用的哈希函数已被证明遭到破解。
一点点数学就可以保守秘密
密码学资产的安全性源自私钥背后的密码学和数学——只要我们保管好自己的私钥即可。迄今为止,还没有人可以通过暴力破解方式找到与你的区块链地址对应的私钥,因为这需要消耗的能量比太阳存储的能量都多。