作者:景辰
链接:https://www.zhihu.com/question/22399196/answer/201836128
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一文读懂比特币私钥、公钥、钱包地址的来历和关系

对比特币熟悉的朋友一定都知道,买卖比特币最后都是通过一个钱包地址来实现的,就像我们日常使用的银行卡卡号,我们随便找一个比特币的钱包地址,大家看一下:1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7
但是当谈到比特币的钱包地址是如何算出来的时候,可能就很少有人能够说清楚了。下面,景辰通过实际计算,来给大家讲解一下比特币的钱包地址是怎么来的,公钥、私钥是怎么来的,以及他们三者之间的关系。

下面的过程你不一定懂得转换的原理,知道他们流转的过程就可以了。

众所周知,比特币是建立在数学加密学基础上的,而不是像银行卡那样是基于信用的,基于信用体系的银行卡卡号我们都熟悉,是我们在向银行申请银行卡的时候银行给随机发的,那么比特币的钱包地址是怎么来的呢?在《比特币:一种点对点的电子现金系统》一文中,中本聪提到了用椭圆加密算法(ECDSA)来产生比特币的私钥和公钥。

基于椭圆加密的原理,由私钥是可以计算出公钥的,再由公钥经过一系列数字签名运算就会得到比特币钱包地址。因为由公钥可以算出比特币地址,所以我们经常把公钥和比特币地址的说法相混淆,他们都是指的同一个概念,比特币钱包地址只是另一种格式的公钥,但是两者的外在表现形式是不一样的。

那么我们就可以梳理出一个脉络了:私钥 —— 公钥 —— 比特币钱包地址。

从比特币私钥得到我们日常转账所用的比特币钱包地址总共需要九个步骤,中间用到了SHA256加密、RIPEMD160加密和BASE58编码。

下面,我们以实际案例来模拟一下整个流程:

第一步:生成随机私钥私钥是一个随机数,随机选取一个32字节的数,这个数的范围大小是介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间的一个数,为了方便后面的计算,我们随机生成一个合法的私钥:8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

第二步:椭圆曲线算公钥生成了私钥之后,我们使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥,生成的公钥共65字节, 其中一个字节是0x04,其中32个字节是X坐标,另外32个字节是Y坐标:

公钥P.X:06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385公钥

P.Y:FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

第三步:计算公钥的SHA-256哈希值将上述公钥地址拼合,得到标准地址:0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

对齐进行SHA-256哈希计算,得到结果:

2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d

第四步:计算 RIPEMD-160哈希值取上一步结果,进行RIPEMD-160计算,得到结果:

0b14f003d63ab31aef5fedde2b504699547dd1f6

第五步:加入地址版本号(比特币主网版本号“0x00”)取上一步结果,在前面加上16进制的00,即:000b14f003d63ab31aef5fedde2b504699547dd1f6

第六步:计算 SHA-256 哈希值取上一步结果,进行SHA-256计算,可得:ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536

然后,对以上结果再次计算 SHA-256 哈希值,得到:869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078

第七步:取上一步结果的前4个字节(8位十六进制)869ac57b

第八步:把这4个字节加在第五步的结果后面作为校验位,将这4个字节加载第五步的结果后面,这就是比特币地址的16进制形态了:

869ac57b000b14f003d63ab31aef5fedde2b504699547dd1f6

第九步:用Base58编码变换一下地址对上一步的结果进行Base58编码,得到:

1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7

这就是我们经常看到的传统意义上的比特币钱包地址了。

以上步骤可以简化为下图所示:

我们经常说的比特币公钥就是指的图中第二步所产生的结果,而HASH160指的是第四步RIPEMD160签名所产生的结果,由于RIPEMD也是一种HASH算法所以就统称为HASH160了,而我们常用的比特币地址就是经过BASE58编码后的结果。

(转)知乎:一文读懂比特币私钥、公钥、钱包地址的来历和关系相关推荐

  1. 一文读懂AI如何判断照片中人物的社交关系

    本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处 本文共2256字,建议阅读6分钟. 本文为你介绍AI判断人物社交关系的原理.方法和效果. 人类,天生就有八卦嗅觉. 比如匡扶 ...

  2. 一文读懂比特币现金(BCH)

    摘要 比特币现金(BitcoinCash)与比特币相同,是一种基于去中心化,采用点对点网络与共识主动性,开放源代码,以区块链作为底层技术的加密货货币.比特币社区围绕扩容问题争论了三年之久,终于在201 ...

  3. 一文读懂比特币UXTO,TA其实没那么神秘!

    本文作者为中国信息通信研究院(工信部电信研究院)专家敖萌博士,雷锋网独家特约文章,雷锋网与信通院联合首发.未来,敖萌博士原创的区块链系列文章还将继续刊出,雷锋网与信通院相关平台同步更新,敬请关注! 比 ...

  4. 运用高斯核模型进行最小二乘回归_比特币价格与时间存在关系?一文读懂比特币价值的对数增长模型...

    免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦

  5. 一文读懂Python web框架和web服务器之间的关系

    我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中. 在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数 ...

  6. 一文读懂标量、向量、矩阵、张量的关系

    文章目录 一.标量 百度百科和维基百科 二.向量 向量的四种表示方法 代数表示 几何表示 坐标表示 矩阵表示 百度百科和维基百科 三.矩阵 百度百科和维基百科 四.张量 百度百科和维基百科 五.标量. ...

  7. 一文读懂云计算、大数据和人工智能间的关系和区别

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 今天跟大家讲讲云计算.大数据和人工智能.为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系 ...

  8. 一文读懂SCADA、DCS与PLC之间的不同

    一文读懂SCADA.DCS与PLC之间的不同 - 知乎 一文读懂SCADA.DCS与PLC之间的不同 - 知乎随着工业企业智能化应用水平的提升,越来越多的人开始接触到各种工业自动化系统和产品,比较常见 ...

  9. 区块链产业生态、存在问题及政策建议|一文读懂新趋势

    区块链产业生态.存在问题及政策建议|一文读懂新趋势 2017-03-03 09:47:50  来源: 腾讯研究院抢沙发 摘要:从技术上来讲,区块链是一种分布式的记账方法.说到记账,我们经历了从实物记账 ...

  10. 一文读懂Faster RCNN

    来源:信息网络工程研究中心本文约7500字,建议阅读10+分钟 本文从四个切入点为你介绍Faster R-CNN网络. 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在20 ...

最新文章

  1. Quartz动态添加、修改和删除定时任务
  2. 性能超FPN!北大、阿里等提多层特征金字塔网络
  3. Git之常用命令的综合使用和示例分析
  4. linux驱动私有数据,linux驱动开发之字符设备--私有数据和container_of
  5. JVM 问题排查常用命令
  6. linux下gsl怎么运行,linux下gsl安装问题与解决
  7. Citrix 修复严重漏洞,可导致 XenMobile Server 遭接管
  8. ctp怎么设置java的编码为GBK_GitHub - yuelong2456/java-ctp: java包装的上期ctp,用swig技术实现。...
  9. Java异常处理之------Java方法中throws Exception使用案例!什么情况下使用throws Exception?...
  10. MATLAB和C语言的区别
  11. 如鹏网.Net三层架构第二章登录和会员管理
  12. C++ 单词查询程序
  13. 游戏HTML翻翻乐,大班益智游戏翻翻乐教案
  14. 计算机网络术语sonet,计算机网络(第七版)谢希仁-第2章 物理层(示例代码)
  15. Android版本更新
  16. matlab理论知识点,matlab基础知识点.doc
  17. 外键 ‘FK__ICBCCard__CardID__3E1D39E1‘ 引用了位于被引用表 ‘StudentCard‘ 中的无效列 ‘CardID‘。
  18. Tomcat And Servlet (1)
  19. Android中根据dialog的展示与否控制软键盘的显示与隐藏
  20. 《创践——大学生创新创业实任务》 单元测试_ 笔记

热门文章

  1. 嵌入式专业名词整理(以后会不断完善)
  2. Servlet初步认识(一)
  3. Java:转换汉字为unicode形式的字符串和转换unicode形式字符串转换成汉字
  4. 一起谈.NET技术,巨大转变!ASP.NET MVC2调用AJAX新特征
  5. 《基于MFC的OpenGL编程》Part 3 Drawing Simple 2D Shapes
  6. atlas对webpart的增强
  7. 设计模式-第二篇之简单工厂模式
  8. 「WC 2019」数树
  9. 自己制作博客园打赏功能
  10. python自动化测试学习笔记-4内置函数,处理json