美文网首页
BTC 私钥、公钥、地址

BTC 私钥、公钥、地址

作者: AlleniCode | 来源:发表于2018-06-20 18:08 被阅读1585次

BTC 密钥对

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。

  • 私钥(k)是一个随机数字。
  • 公钥(K)是由私钥(k)使用椭圆曲线乘法这个单向加密函数产生的(K = k * G)。
  • 地址(A)是由公钥(K)使用一个单向加密哈希函数生成的。
比特币密钥.png

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 数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。

Base58Check 编码也被用于比特币的其它地方,例如比特币地址、私钥、加密的密钥和脚本哈希中,用来提高可读性和录入的正确性。

比特币地址.png
Base58Check 编码

为了使用 Base58Check 编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数据的类型。例如,比特币地址的前缀是 0(十六进制是 0x00),而对私钥编码时前缀是 128(十六进制是 0x80)。

接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次 SHA256 哈希算法:
checksum = SHA256(SHA256(prefix+data))

在产生的长 32 个字节的哈希值(两次哈希运算)中,我们只取前 4 个字节。这 4 个字节就作为校验码,校验码会添加到数据之后。

结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程:

比特币地址Base58Check编码过程.png

Base58Check 编码:一种 Base58 格式的、有版本的、经过校验的格式,可以明确的对比特币数据编码的编码格式。

在比特币中,大多数需要向用户展示的数据都使用 Base58Check 编码,可以实现数据压缩,易读而且有错误检验。Base58Check 编码中的版本前缀是数据的格式易于辨别,编码之后的数据头包含了明确的属性。这些属性使用户可以轻松明确被编码的数据的类型以及如何使用它们。例如我们可以看到他们的不同,Base58Check 编码的比特币地址是以 1 开头的,而 Base58Check 编码的私钥 WIF 是以 5 开头的。

  • Base58Check 版本前缀和编码后的结果
    Base58Check 版本前缀和编码后的结果.png

比特币地址生成过程:

比特币地址@2x.png

Donation 捐赠

  • BTC Address:3G8soXRrrGxrNWSHrsPiZBS4d1UhJkijSx
捐赠地址.PNG

总结

欢迎留言讨论,有错误请指出,谢谢!

【联系我(QQ:3500229193)或者加入社群,请戳这里!】

参考链接

更新日志

  • 2018.06.20 第一次更新
  • 2018.06.26 第二次更新

相关文章

  • BTC 私钥、公钥、地址

    BTC 密钥对 一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。 私钥(k)是一个随机数字。...

  • 优一区块链知识学习笔记5

    公钥和私钥 公钥加密,私钥解密 私钥→椭圆曲线乘法→公钥→单向加密哈希函数→比特币地址(过程不可逆) 私钥:随机选...

  • 比特币学习(一):私钥与地址

    对于比特币而言,公钥对应着btc地址,私钥相当于密码,拥有私钥意味着掌握了这个地址,所以了解私钥是非常重要的。 我...

  • 公钥、私钥、地址

    私钥 ->SECP256K1算法处理 -> 公钥 ->公钥 K 为输入,计算其SHA256哈希值,并以此结果计算R...

  • 比特币源码研读之密钥篇

    这是我的第五篇研读记录,抽空写了点欢迎拍砖。 首先讲一下私钥、公钥、地址的关系 私钥通过椭圆曲线相乘推出公钥,公钥...

  • 比特币源码研读(2)--钱包标准BIP32

    之前了解了比特币的私钥、公钥和地址。简单地说,私钥是256位的随机数,公钥是私钥通过椭圆曲线算法计算出来,而地址是...

  • 1、私钥-公钥-地址

    资料: http://book.8btc.com/books/1/master_bitcoin/_book/4/4...

  • 私钥、公钥和地址

    私钥、公钥、地址在目前看来就是一串(几乎)不可能碰撞的字符串。可以用四个等式来说明 k = random() (0...

  • 应用程序数字签名技术

    什么是公钥和私钥 公钥加密,私钥解密私钥加密,公钥解密 苹果的数字签名

  • RSA加密解密函数

    一、已有公钥私钥1、私钥解密 二、已有公钥私钥文件

网友评论

      本文标题:BTC 私钥、公钥、地址

      本文链接:https://www.haomeiwen.com/subject/htmtyftx.html