BTC 密钥对
一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。
- 私钥(k)是一个随机数字。
- 公钥(K)是由私钥(k)使用椭圆曲线乘法这个单向加密函数产生的(K = k * G)。
- 地址(A)是由公钥(K)使用一个单向加密哈希函数生成的。
BTC 私钥
私钥就是一个随机数字,它可以是 1 和 n-1 之间的任何数字,其中 n 是一个常数(n = 1.158*10^77,略小于 2^256)。要生成这样的一个私钥,我们随机选择一个 256 位的数字,并检查它是否小于 n-1。一般使用密码学安全的伪随机数生成器(CSPRNG)来生成这样一个随机数。
以下是一个随机生成的私钥(k),以十六进制格式表示(256 位的二进制数,以 64 位十六进制数显示,每个十六进制数占 4 位):
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
比特币私钥空间的大小是 2^256,这是一个非常大的数字。用十进制表示的话,大约是 10^77,而可见宇宙被估计只含有 10^80 个原子。
把私钥以 Base58 校验和编码格式显示,这种私钥格式被称为钱包导入格式(WIF,Wallet Import Format)。
BTC 公钥
通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程:K = k * G 。其中 k 是私钥,G 是被称为生成点的常数点,而 K 是所得公钥。其反向运算,被称为“寻找离散对数” —— 已知公钥 K 来求出私钥 k —— 是非常困难的,就像去试验所有可能的 k 值,即暴力搜索。
因为其中的数学运算是单向的,所以私钥可以转换为公钥,但公钥不能转换回私钥。
大多数比特币程序使用 OpenSSL 加密库进行椭圆曲线计算。例如,调用
EC_POINT_mul()
函数,可计算得到公钥。
BTC 地址
比特币地址是一个由数字和字母组成的字符串,它可由公钥经过单向的加密哈希算法得到。
哈希算法是一种单向函数,接收任意长度的输入产生指纹摘要。加密哈希函数在比特币中被广泛使用:比特币地址、脚本地址以及在挖矿中的工作量证明算法。
由公钥生成比特币地址时使用的算法是 Secure Hash Algorithm (SHA) 和 the RACE Integrity Primitives Evaluation Message Digest (RIPEMD),特别是 SHA256 和 RIPEMD160。
以公钥 K 为输入,计算其 SHA256 哈希值,并以此结果计算 RIPEMD160 哈希值,得到一个长度为 160 比特(20 字节)的数字:
A = RIPEMD160(SHA256(K))
公式中,K 是公钥,A 是生成的比特币地址。
通常用户见到的比特币地址是经过 “Base58Check” 编码的,这种编码使用了 58 个字符(一种 Base58 数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。
比特币地址.pngBase58Check 编码也被用于比特币的其它地方,例如比特币地址、私钥、加密的密钥和脚本哈希中,用来提高可读性和录入的正确性。
Base58Check 编码
为了使用 Base58Check 编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数据的类型。例如,比特币地址的前缀是 0(十六进制是 0x00),而对私钥编码时前缀是 128(十六进制是 0x80)。
接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次 SHA256 哈希算法:
checksum = SHA256(SHA256(prefix+data))
在产生的长 32 个字节的哈希值(两次哈希运算)中,我们只取前 4 个字节。这 4 个字节就作为校验码,校验码会添加到数据之后。
结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程:
比特币地址Base58Check编码过程.pngBase58Check 编码:一种 Base58 格式的、有版本的、经过校验的格式,可以明确的对比特币数据编码的编码格式。
在比特币中,大多数需要向用户展示的数据都使用 Base58Check 编码,可以实现数据压缩,易读而且有错误检验。Base58Check 编码中的版本前缀是数据的格式易于辨别,编码之后的数据头包含了明确的属性。这些属性使用户可以轻松明确被编码的数据的类型以及如何使用它们。例如我们可以看到他们的不同,Base58Check 编码的比特币地址是以 1 开头的,而 Base58Check 编码的私钥 WIF 是以 5 开头的。
-
Base58Check 版本前缀和编码后的结果
Base58Check 版本前缀和编码后的结果.png
比特币地址生成过程:
比特币地址@2x.pngDonation 捐赠
- BTC Address:3G8soXRrrGxrNWSHrsPiZBS4d1UhJkijSx
总结
欢迎留言讨论,有错误请指出,谢谢!
【联系我(QQ:3500229193)或者加入社群,请戳这里!】
参考链接
更新日志
- 2018.06.20 第一次更新
- 2018.06.26 第二次更新
网友评论