比特币中的密码学知识汇总
比特币中的密码学知识汇总
目前,我的阅读比特币源码
系列文章已经更新了5篇,对应于精通比特币前3章内容的学习。
现在来到第4章密钥与地址的学习,本章主要介绍了比特币系统中公钥,私钥和地址之间相互的关系,如何生成比特币地址,以及对于比特币地址和密钥的一些高级用法。
在这一章的学习中,对于刚入门的人来说,会被突然冒出的茫茫多密码学相关知识搞得举步维艰,因此对于密码学相关知识有一定了解是必要的。
在经过一段时间的积累后,我将比特币中涉及的密码学知识相应的优质教程进行汇总如下。(本文不涉及知识的详细讲解,仅提供一个梳理后的资料大纲,大家按需学习)
比特币中涉及的密码学知识有:
- SHA-256
- RIPEMD-160
- Base58 Encode
- Base58Check Encode
- Elliptic Curve
下面分别给出更详细汇总结果。
1. 数字指纹
数字指纹,又称哈希函数,散列算法,是一种从任何一种数据中创建固定大小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。
SHA 和 RIPEMD 是两类重要的哈希函数集合,具体地,SHA-256 和 RIPEMD-160 在比特币系统中使用公钥生成公钥哈希
的过程中被应用。
下面来看看具体的教程推荐。
1.1 SHA-256
作为一个简单了解,推荐这个教程。直观体验SHA-256是什么?为什么进行SHA-256?如何验证SHA-256结果?
操作指南:验证SHA256
进一步可以参看SHA-2系安全散列算法的wiki百科页面,比较综合,有解释有代码
wiki:SHA-2
如果想深究原理,建议看我写的这篇博文,费了不少功夫,个人感觉解释的很详细。
SHA256算法原理详解
SHA256 的C语言实现
1.2 RIPEMD-160
想简单了解RIPEMD-160,探索 RIPEMD-160 是什么? 有多快? 以及一些更深入学习的链接。推荐下面两个链接
wiki : RIPEMD
The hash function RIPEMD-160
进一步可以参看RIPEMD-160的bitcoinwiki页面,具体过程更详细一些,有伪代码提供
bitcoinwiki : RIPEMD-160
对细节要求严苛的话,直接看论文吧:
The Cryptographic Hash Function RIPEMD-160
2. 非对称加密
在比特币系统中,我们使用公开密钥加密(非对称加密)创建一个密钥对来控制比特币的获取。这个密钥对包含了一个私钥和一个(由私钥导出的唯一)公钥。公钥被用来接收款项,私钥被用来签署一笔交易来花费比特币。
公钥和私钥的背后存在着数学联系,来保证私钥可以被用来在消息上进行签名,并且这个签名可以被任何人使用对应的公钥验证(在不接触私钥的情况下)。
在比特币系统中,你需要学习的非对称加密相关知识有:
首先,了解非对称加密的基本概念非对称加密概述
随后,比特币的公钥是由私钥通过椭圆曲线乘法导出的,那么什么是椭圆曲线?
如果你很难理解椭圆曲线,不妨先学一个更简单的非对称加密算法作为过渡:RSA加密算法
此外,在交易中,需要使用私钥进行签名,那么什么是数字签名?
最后,作为链圈币圈的人,如果感兴趣不妨了解下什么是数字证书?
具体资料如下:
2.1 椭圆曲线算法
掌握椭圆曲线需要对于模运算有所了解,这个网站提供了一些非常简单的教程,还有测试和小游戏用来巩固概念,挺有意思的。
模运算
椭圆曲线算法的数学性应该算是区块链相关知识中比较强的,很多教程号称用一种简单直白的方式在不涉及数学的情况下让你明白什么是椭圆曲线,相信我那不靠谱。
学习椭圆曲线算法最好的方式就是找经典英文教材,耐下心来读。推荐这个系列教程共4篇:
1. a gentle introduction
2. finite fields and discrete logarithms
3. ECDH and ECDSA
4. breaking security and a comparison with RSA
读完这些,你再回过头来看一些中文资料,既能看懂,又能加深理解。
椭圆曲线加密算法介绍
椭圆曲线算法的几个不同角度的解释(知乎)
2.2 RSA算法
如果你很难理解椭圆曲线,不妨先学一个更简单的非对称加密算法:RSA加密算法
RSA加密算法的简单介绍:
wiki:RSA algorithm
RSA Encryption – Tutorial
RSA加密算法流程的详细教程:
阮一峰的网络日志:RSA算法原理(一)
阮一峰的网络日志:RSA算法原理(二)
How RSA Works With Examples
2.3 数字签名
比特币系统中,一笔交易归属以及真伪的验证使用了数字签名技术。
数字签名指的是对一段信息制作签名表示对其的认可,这个认可只对该信息有效,并且第三方无法根据该签名构造你对其他信息的签名。数字签名方案包括:
生成公钥私钥对,私钥用于签名,必须安全保存;公钥可以公开,用于他人验证签名有效性
把信息和私钥作为输入,输出即为签名
使用公钥,信息和签名作为输入,进行验证
在实践中,我们往往通过对哈希值进行签名,这样可以实现对任意长度信息的签名。
详细过程可以阅读What is a Digital Signature?
以及非对称加密概述中的数字签名部分
2.4 数字证书
数字证书是非对称加密的又一个重要应用,据我所知在比特币系统中并没有直接应用。但也确实是个重要的概念,作为链圈币圈的人,如果感兴趣不妨了解下什么是数字证书?
推荐看这篇文章数字证书原理,讲的很清晰
3. Base58编码
Base58编码在比特币的密钥和地址的编码中被广泛使用,用来增强密钥或地址的可读性以及防止传输或转录过程中发生错误。
例如,比特币地址是在公钥哈希的基础上,使用Base58Check编码得到的。
3.1 Base58 Encode
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
Base58是在base64编码的基础上得到的,去掉了容易混淆的字母(不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”),以及影响双击选择字符串的字母(”+”和”/”符号)。
我们首先要需要了解什么是Base64编码
wiki : base64
Base64笔记(阮一峰的网络日志)
然后再来学习base58编码
wiki : base58
learn me a bitcoin : Base58
3.2 Base58Check Encode
而 Base58Check 编码其实就是在Base58编码的基础上,添加了校验的过程。流程并不复杂,如下图所示:
其实上图已经将 Base58Check 编码的过程描述清楚了,更多的细节请参考:
bitcoinwiki : Base58Check encoding
比特币中的密码学知识汇总相关推荐
- java接口那一节是哪的知识_Java中的接口知识汇总
Java中的接口知识汇总 发布于 2020-4-29| 复制链接 本文给大家汇总介绍了在java中的接口知识,包括为什么要使用接口.什么是接口.抽象类和接口的区别.如何定义接口以及定义接口注意点,希望 ...
- 自行车中的物理知识汇总
自行车中包含的物理知识有哪些?虽然自行车结构简单,方便实用,但其中涉及到很多物理知识,包括杠杆.轮轴.摩擦.压强.能量的转化等力学.热学及光学知识,下面让我们具体来分析一下. 一.力学知识 1.摩擦方 ...
- c语言中0x12是什么进制,C语言中进制知识汇总
1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数 ...
- java中类的接口是什么_Java中的接口知识汇总
一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...
- iconv命令 php,PHP中iconv函数知识汇总
iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库.本文内容是参考了网上的其他资源,然后结合自己的实践,有需要的小伙伴可以参考下. 今天在修改论文在线的时候,遇到了icon ...
- 区块链中的密码学(五)-零知识证明简述
本篇是这个系列的最后一篇,尽管在区块链中还有很多的密码学应用,将来会必然会更多,然而笔者认为,就今天我们有限的学习时间来讲的话,任何人都应该对信息的获取做减法.思来想去,选择了"零知识证明& ...
- 读心术:从零知识证明中提取「知识」——探索零知识证明系列(三)
本文已更新至Githubhttps://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/3/zkp-pok.md 导言:有些理论非常有趣,零 ...
- 解密区块链中的密码学
在这片文章中,我们总结了区块链会用到的一些密码学原语,那什么是密码学"原语"? 不同于操作系统的"原语"概念,(注:操作系统原语是操作系统或计算机网络用语范畴. ...
- 区块连中的密码学--SHA256实现机制
区块连中的密码学–SHA256实现机制 摘要 本文主要介绍区块链中所使用的密码学知识,同时因为Hash函数是区块链中重要的一环,因此也使用python3对SHA256进行了实现. 一.什么是区块链 关 ...
最新文章
- linux 大量的TIME_WAIT解决办法
- C# 学习笔记(10)加速球
- java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法
- 读博士也有技巧:如何快乐地做研究
- c# 轻量级ORM框架 实现(一)
- CentOS 7 新建桌面快捷方式,实现一键跳转到指定的文件夹路径
- 分布式系统可观测性之应用业务指标监控
- 【基于微信小程序的社区电商平台】需求分析心得——小豆芽
- 解决Kangle的Easypanel控制面板用户前台php版本无法切换的解决方法
- 如何升级composer
- Caused by: org.springframework.web.client.RestClientException: Error while extracting response for t
- 3dsmax-拓扑插件Wrapit使用
- 【OpenPCDet】Kitti数据集下训练PointPillars并评估可视化
- python字符串截取规则_Python字符串截取
- 《那些年啊,那些事——一个程序员的奋斗史》——119
- canvas 动态镂空
- android popupwindow获取焦点,popupwindow焦点问题解决方案
- 「网络流 24 题」5.圆桌聚餐
- js中几种追加元素的方法
- Linux fcitx用不了中文,关于fcitx输入法不能使用中文解决办法
热门文章
- js实现右键单击打开自定义的菜单
- 算法训练 Pollution Solution(计算几何)
- 喜欢的一些话(不断更新)
- HDU 4431 Mahjong(模拟题)
- .net 中使用socket (c#)
- linux文件IO——文件IO介绍
- BP神经网络分类实战项目(深度学习笔记)原创!基础篇||PCA降维、反向传播公式、梯度下降、标准化、倾斜样本处理、独热编码、Adam优化算法、权值初始化、F1-Score、ROC、模型可视化
- java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理
- 命令行参数怎么输入_太好用了!谷歌开源的命令行接口工具fire
- android actionbar 背景,Android应用开发之定制页面背景及Actionbar overflow menu的背景色...