写点什么

揭秘比特币和区块链(三):比特币的私钥、公钥与地址

2016 年 6 月 23 日

地址、交易、区块、网络是区块链数据里面最基本最重要的概念。地址用来标示一笔交易的支出方和接收方。所有的交易最终需要被记到统一的账本——区块链上,而这个账本是通过区块确认并完成的。每一个新区块,都会被打上时间戳,最终生成依照时间前后排列并加以记录。每个独立节点之间又通过比特币网络来建立联系,这样就为电子交易记录建立了一个去中心化、分布式的时间戳服务器系统。

很复杂,在这一节,我们先讲地址。

另外,想快速了解并掌握区块链技术的同学,可以购买极客时间出品的『深入浅出区块链』专栏。专栏立足于区块链技术,带你形成完整的区块链知识体系。作者还会手把手教你构建自己的迷你区块链,把你真正带进区块链的世界。

1、公钥密码学

讲到地址,我们就不得不先说一说密码学,作为保护信息传输安全的技术手段,密码在人类社会中的应用源远流长,凯撒密码是古典密码的典型代表,它的基本思想是通过字符的代换来实现加解密。因此古典密码的安全性主要依赖加密算法本身的安全性,如果算法泄露了,要加密的信息也就没有秘密可言了。

如今密码学相关技术已经深入各个领域,它们的理论共识都遵循由奥古斯特•柯克霍夫在 19 世纪提出“柯克霍夫原则”—— 密码系统应该即使被所有人知道其运作步骤,仍然是安全的。即算法是公开的,唯一需要保护的是密钥。

1949 年香农发表了《保密系统的信息理论》,为对称密码系统建立了理论基础,带来了加密传输基于秘钥安全而不是基于加密算法安全的理论和技术变革。这是密码学发展的里程碑,标志着现代密码学时代的来临。

公钥密码学兴起之前,对称加密是主流的加密模式,人们基于秘钥来对信息进行加解密,通常情况下,密钥越长,代表着密文被破解的难度越大。由于加密算法和解密算法都是同一模式,只有一把密钥保证加密数据的安全,因此这种加密算法也叫做“对称加密算法”。对称加密有一个最大弱点:甲方必须把密钥告诉乙方,否则乙方无法解密。而保存和传递密钥,就成了最头疼的问题。

公钥密码学是现代密码学最重要的进展。公钥密码学可以在不直接传递密钥的情况下,完成密文的解密。加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,系统的安全性既不依赖算法的保密,也不用直接传递密钥。基于这种公钥机制的思想,开始出现了一系列非对称加密算法。

1976 年 Whitfield Diffie & Martin Hellman 首次提出了基于数学难题的公钥密码机制,1978 年 RSA 公钥密码机制的出现,成为公钥密码的杰出代表并成为事实标准,在密码学史上创造了又一个新的里程碑。90 年代公钥密码学进一步发展,基于椭圆曲线乘法、素数幂等数学函数的公钥算法诞生,使得数字密钥和不可伪造的数字签名成为可能。

数据签名算法的核心在于证明数据的发送方是签名者发出的、不可抵赖,而不是待签名数据的保密性。

下图比较说明非对称加密与对称加密算法的区别:

非对称加密需要两个(一对)密钥:公开密钥(publickey)和私有密钥(privatekey),用公钥对数据进行加密后,只有对应的私钥才能解密;反之如果私钥用于加密,则只有对应的公钥才能解密。通信双方无须交换密钥就可以建立保密通信。

公钥算法用到的是私钥与公钥,他们和比特币体系中常常说到的地址有什么关系?在比特币系统中,私钥由 32 字节的随机数组成,通过私钥可以算出公钥,公钥经过一系列哈希及编码算法就得到了比特币中的地址。所以地址其实是公钥的另一种表现形式,可以理解为公钥的摘要。

2、相关的加密算法

在私钥、公钥及地址的相关运算中,用到了基于 secp256k1 椭圆曲线乘法的签名算法、SHA-256、RIPEMD-160,和 Base58 编码。

2.1 椭圆曲线签名算法

椭圆曲线在密码学中的使用是在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出的。它的主要优势是在某些情况下它比其他的算法(比如 RSA)使用更小的密钥但提供相当的或更高等级的安全性。

比特币使用了基于 secp256k1 椭圆曲线数学的公钥密码学算法。它包含私钥与公钥,私钥用于对交易进行签名,将签名与原始数据发送给整个比特币网络,公钥则用于整个网络中的节点对交易有效性进行验证。签名算法保证了交易是由拥有对应私钥的人所发出的。

2.2 哈希函数

SHA-256 是一种哈希函数,已经在上一节的讲解中做了介绍,这里不再赘述 [1]

RIPEMD-160 也是在生成地址时用到的一种哈希函数,其输出长度为 20 字节(160 位)。比特币用它减少标识接收方的字节数。

2.3 Base58 编码

可读性编码算法,类似古典密码学里的置换算法,理论上并不是密码学理论的核心内容。可读性编码算法不是为了保护数据的安全性,而是为了可读性。以二进制进行传输的信息是不具备可读性的,数字与字母组成的字符串才更容易被识别。可读性编码不改变信息内容,只改变信息内容的表现形式(部分编码算法还加入了容错校验功能,以保证传输过程中数据的准确性和完整性)。

Base64 是常见的可读性编码算法,所谓 Base64,即是说在编码过程中使用了 64 种字符:大写 A 到 Z、小写 a 到 z、数字 0 到 9、“+”和“/”。

Base58 是 Bitcoin 中使用的一种编码方式,主要用于产生 Bitcoin 的钱包地址。相比 Base64,Base58 不使用数字"0",字母大写"O",字母大写"I",和字母小写"i",以及"+“和”/"符号。

设计 Base58 主要的目的是:

  1. 避免混淆。在某些字体下,数字 0 和字母大写 O,以及字母大写 I 和字母小写 l 会非常相似。
  2. 不使用"+“和”/"的原因是,非字母或数字的字符串难以作为账号的一部分被接受。
  3. 没有标点符号,通常不会被从中间分行。
  4. 使大部分的软件支持双击选择整个字符串。

比特币中使用 Base58 算法来对公钥的 Hash160 及私钥进行编码,以生成以 1 或 3 开头的比特币地址及 WIF(Wallet import Format) 格式的私钥。

3、私钥与公钥

比特币私钥其实是使用 SHA-256 生成的 32 字节(256 位)的随机数,有效私钥的范围则取决于比特币使用的 secp256k1 椭圆曲线数字签名标准。大小介于 0x1 到 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140 之间的数几乎都是合法的私钥。

在私钥的前面加上版本号,后面添加压缩标志和附加校验码,(所谓附加校验码,就是对私钥经过 2 次 SHA-256 运算,取两次哈希结果的前四字节),然后再对其进行 Base58 编码,就可以得到我们常见的 WIF(Wallet import Format) 格式的私钥。

私钥经过椭圆曲线乘法运算,可以得到公钥。公钥是椭圆曲线上的点,并具有 x 和 y 坐标。公钥有两种形式:压缩的与非压缩的。早期比特币均使用非压缩公钥,现在大部分客户端默认使用压缩公钥。

由于数学原理,从私钥推算公钥是可行的,从公钥逆推私钥是不可能的。

初识比特币的人常有一种误解,认为比特币公钥就是地址,这是不正确的。从公钥到地址还要经过一些运算。

4、地址的生成

椭圆曲线算法生成的公钥信息比较长,压缩格式的有 33 字节,非压缩的则有 65 字节。地址是为了减少接收方所需标识的字节数。比特币地址的生成步骤如下:

  1. 生成私钥与公钥
  2. 将公钥通过 SHA256 哈希算法处理得到 32 字节的哈希值
  3. 后对得到的哈希值通过 RIPEMD-160 算法来得到 20 字节的哈希值 —— Hash160
  4. 把版本号 [2] +Hash160 组成的 21 字节数组进行双次 SHA256 哈希运算,得到的哈希值的头 4 个字节作为校验和,放置 21 字节数组的末尾。
  5. 对组成 25 位数组进行 Base58 编码,就得到地址。

下图以非压缩格式的 65 字节公钥示意上述过程:

由于椭圆曲线乘法以及哈希函数的特性,我们可以从私钥推导出公钥,也可以从公钥推导出地址,而这个过程是不可逆的。也正因如此,在整个比特币系统中,私钥是最关键的部分。私钥泄露也就意味着丢失了一切。

我们要花掉一个地址上的资产,需要构造一笔交易,同时使用这个地址对应的私钥签名。而如果我们要将资产转移到某个地址上,只需要转账给他公开的地址就行了。

在下一节,我们将详细讲述比特币交易是如何构成和实现的。


[1] http://www.infoq.com/cn/articles/bitcoin-and-block-chain-part02

[2] 普通地址 P2PKH 的版本默认值是 0,P2SH 类型的地址版本默认值是 5


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 6 月 23 日 18:5626954

评论

发布
暂无评论
发现更多内容

全面 Severless 化只需要 7天!看南瓜电影的云上升级

阿里巴巴中间件

阿里巴巴 中间件

散布消极言论被开除的总监 | 法庭上的CTO(25)

赵新龙

CTO 法庭上的CTO

犯”集资诈骗罪“、二审判6年的CTO | 法庭上的CTO(21)

赵新龙

CTO 法庭上的CTO

开设赌场的CTO | 法庭上的CTO(23)

赵新龙

CTO 法庭上的CTO

被砍伤的技术VP | 法庭上的CTO(24)

赵新龙

CTO 法庭上的CTO

IPFS挖矿系统开发详情案例

系统开发咨询1357O98O718

IPFS云算力挖矿系统开发 IPFS算力挖矿软件系统开发

小说内容理解

DataFunTalk

AI 推荐系统

百分点智能对话技术探索实践

DataFunTalk

AI

“让专业的人做专业的事”,畅捷通与阿里云的云原生故事

阿里巴巴中间件

云计算 云原生

阿里P8大牛亲自讲解!6年菜鸟开发面试字节跳动安卓研发岗,成功收获美团,小米安卓offer

欢喜学安卓

android 程序员 面试 移动开发

IPFS挖矿矿机系统开发方案丨IPFS挖矿矿机源码案例

系统开发咨询1357O98O718

IPFS云算力挖矿系统开发 IPFS算力挖矿系统开发搭建

Serverless 在 SaaS 领域的最佳实践

阿里巴巴中间件

阿里巴巴 中间件

盘点2020 | YourBatman 2020年感悟关键词:科比、裁员、管理层、活着

YourBatman

裁员 盘点2020 科比 管理层 活着

时空大数据与智能技术的时代共舞,百度地图给2020的答案

脑极体

ArrayList源代码分析

肥鱼先生

架构师训练营第一周作业

Mark

10次面试,2份offer —— 大龄程序员 2020 求职记录

escray

面试经历 架构师训练营第 1 期 101次面试

盘点2020 | 2021,Begin Again !

大导演

前端进阶训练营 盘点2020

侵犯著作权、判刑两年半的 CTO |法庭上的CTO(22)

赵新龙

CTO 法庭上的CTO

NoahTenet诺亚信条软件系统APP开发

开發I852946OIIO

系统开发

年末了,放个大招,力软.net/java新产品附赠服务器,不容错过

力软.net/java开发平台

Java .net 服务器

图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应

李先生

DevOps 运维 HTTP SRE

母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列

叫练

多线程与高并发 Wait lock 线程互斥 await

SpringCloudGateway(一) 概览

Java SpringcloudGateway

腾讯T2手把手教你!字节跳动历年校招Android面试真题解析,含BATJM大厂

欢喜学安卓

android 程序员 面试 移动开发

阿里P8大牛亲自讲解!Android高级工程师面试实战,Android岗

欢喜学安卓

android 程序员 面试 移动开发

互联网大厂有哪些分库分表的思路和技巧?

冰河

分布式数据库 分库分表 分布式存储 数据一致性 数据同步

生产环境全链路压测建设历程 23:FAQ 3、4 适配改造,目标压力

数列科技杨德华

全链路压测 七日更

总结2020:5个月出版两本书,日更公众号是一种怎样的体验?

冰河

程序员 程序人生 年终总结

C语言编程:入门指南(一周内学懂)

计算机与AI

c

鸟枪换炮,利用python3对球员做大数据降维(因子分析得分),为C罗找到合格僚机

刘悦的技术博客

Python 数据分析 特征选择 降维

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

揭秘比特币和区块链(三):比特币的私钥、公钥与地址-InfoQ