比特币密钥是什么?
比特币密钥是确定比特币所有权机制的重要组成部分。每一个比特币密钥都是成对出现的,一个密钥对由一个私钥和一个公钥组成。因此比特币密钥也常被成为比特币密钥对。
比特币密钥实际上并不存储在比特币网络中,而是存储在一个叫做钱包的文件或简单的数据库中。比特币密钥由用户的钱包软件生成并管理,无需参照区块链或访问网络,其完全独立于比特币协议。
比特币密钥在比特币去中心化信任和控制、所有权认证和安全性能方面均可发挥重要作用。
私钥
私钥本质上是一个256位的随机整数。也就是说,比特币私钥其实只是一个数字,且这个数字是随机生成的,同时这个数字长达256位。这就相当于以0和1标记硬币正反面,累计抛256次硬币才能得到这样一个数字。
那么这个随机整数是如何生成的呢?
概括而言,比特币私钥的生成可以分为两个步骤:随机数生成+SHA256哈希算法运算。其中,随机数生成是比特币私钥生成的第一步,也是最重要的一步,其本质是找到足够安全的熵源,即随机性来源。实际上,生成比特币私钥就相当于在1到2^256之间随机选一个数字,并要求选取的结果是不可预测或不可重复的。或者更准确地说,比特币私钥可以是1和n-1之间的任何数字(n为常数,n=1.158*10^77,略小于2^256)。具体而言,比特币使用操作系统底层的随机数生成器作为随机性来源,选取一长串随机字节。随后对其进行SHA256哈希算法运算,即可生成一个256位的数字。如果运算结果小于n-1,该数字即可成为一个私钥,如若不然,则重新选取随机数再进行运算。
如下所示,就是我们常见的一个比特币私钥:
但和上文所述不同的是,这个私钥并非一个256位的随机数。实际上,这是256位随机整数的变体。因为如果将这个256位的随机整数显示出来,不仅识别率不高,且长度过长。因此,通常将这个256位的随机整数以十六进制字符串表示。同时由于每两个十六进制字符表示一个字节,则该十六进制字符串最终表现为32个字节组成的数组。
通过上述内容,我们已经知道,比特币私钥的上限是2^256,该数值非常巨大,已经远超整个银河系的原子总数。因此,想要遍历(计算机术语,可以通俗理解为把每种组合都试一遍)所有的私钥是不可能实现的。因此,比特币私钥实现了密码学安全,这种安全性是由数学保证的。
私钥的作用在于,在比特币交易中生成支付比特币所必需的数字签名,以证明对比特币的所有权。换句话说,假设你有10枚BTC,你的比特币私钥就是能够证明这10枚BTC的确属于你的唯一凭证。而也正是由于该特性,私钥必须始终保持机密,一旦遭到泄露,相当于受该私钥保护的比特币将被拱手送人。对于比特币用户来说,也应该对私钥进行备份,以防止意外丢失。私钥一旦丢失就找不回来了,这意味着其对应的比特币也将永远丢失。
公钥
公钥是通过比特币私钥计算得来的。具体而言,比特币通过椭圆曲线乘法运算私钥从而得到公钥。计算公式为:
其中,k为私钥,G为椭圆曲线乘法中被称为生成点,K为公钥。生成点G是椭圆曲线乘法标准的一部分,比特币密钥的生成点都是相同的。因此,一个私钥k乘以生成点G将得到对应唯一的一个公钥K。
同时值得注意的是,上述计算过程是不可逆的。这就意味着,要对上述计算公式进行反向计算(也被称为寻找离散对数),即已知公钥K来反向求解私钥k是非常困难的。因为这就相当于试验所有可能的k值,等同于暴力搜索。而之所以可以实现该过程,则是由椭圆曲线乘法算法的特性决定的。
椭圆曲线乘法是被密码学家称之为具有“陷阱门”功能的一种函数,即在一个方向(乘法)很容易计算,而不可能在相反的方向(除法)进行计算。 因此,比特币私钥所有者很容易通过椭圆曲线乘法计算创建公钥,但反过来,没有人可以通过公钥计算出私钥。正是由于这个特性,使得证明比特币资金所有权的比特币私钥实现了不可伪造。
如果说私钥用于比特币支付时的交易签名,公钥则主要用于验证比特币交易。公钥验证比特币交易主要表现在:1.公钥生成地址,验证发送交易的地址是否和该公钥生成的地址一致;2.公钥验证私钥的签名,用来验证该交易是否使用了正确的私钥签名。
比特币地址
比特币地址是一个由数字和字母组成的字符串,可以与任何人分享。
比特币地址与公钥并不相同。比特币地址是公钥通过加密哈希算法生成的。哈希算法是一种单向函数,可以接收任意长度的输入而产生指纹或哈希。由公钥生成比特币地址使用的算法为SHA256和RIPEMD160。计算公式为:
其中,K为公钥,A为生成的比特币地址。具体而言,即以公钥K为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160哈希值,得到一个长度为160位(20字节)的数字。
通常用户见到的比特币地址是经过“Base58Check”编码后的形式,这种编码使用了58个字符(一种Base58数字系统)和校验码,提高了可读性、避免歧义并可有效防止在地址转录和输入中产生错误。常见的比特币地址如下所示:
在比特币交易中,比特币地址通常担任收款方的角色,就相当于接收比特币的收款人。其存在使得比特币交易更为灵活。
总体来说,比特币私钥、公钥和地址三者的关系可以归结为下图:
即基于私钥k,可以使用椭圆曲线乘法计算产生一个对应的公钥K;而后再基于公钥K,可以使用单向加密哈希函数生成比特币地址A。整个过程是不可逆的,只能从私钥k计算出公钥K进而生成地址A,但不能由地址A反向推导出公钥K和私钥k。
最后需要注意的是,公钥和私钥都可以有多种格式。虽然看起来可能不同,但是所编码的是同样的数字。这些不同的编码格式主要是用来方便人们阅读识别和存储。