比特币中的密码学详解
上图描述了密码学的全部分类,以及其对应解决的信息安全分类。
比特币中涉及的密码学知识有:
- SHA-256(哈希函数)
- RIPEMD-160(哈希函数)
- Base58 Encode
- Base58Check Encode
- Elliptic Curve
1. 私钥、公钥、钱包地址
私钥是一个256bits的二进制随机数。
私钥通过椭圆曲线乘法这个单向加密函数产生一个公钥;公钥再通过SHA256和RIPEMD160进行double hash产生比特币钱包地址。
私钥、公钥、钱包地址之间的关系如下图所示:
私钥、公钥、钱包地址
公钥产生钱包地址:
分为两步。
1.公钥哈希
2.公钥哈希编码为钱包地址
关于SHA256可以参考:
https://blog.csdn.net/u011583927/article/details/81432863
SHA256简单概括,包括三个部分:
- 常量的初始化
SHA256算法中用到了8个哈希初值以及64个哈希常量
这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来
- 信息预处理
SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。
信息的预处理分为两个步骤:附加填充比特和附加长度
- 使用到的逻辑运算
SHA256散列函数中涉及的操作全部是逻辑的位运算
2. 非对称加密
在比特币系统中,我们使用公开密钥加密(非对称加密)创建一个密钥对来控制比特币的获取。这个密钥对包含了一个私钥和一个(由私钥导出的唯一)公钥。公钥被用来接收款项,私钥被用来签署一笔交易来花费比特币。
2.1 椭圆曲线算法
https://blog.csdn.net/u011583927/article/details/81432863
2.2 RSA算法
https://blog.csdn.net/u011583927/article/details/81432863
2.3 数字签名
比特币系统中,一笔交易归属以及真伪的验证使用了数字签名技术。
数字签名指的是对一段信息制作签名表示对其的认可,这个认可只对该信息有效,并且第三方无法根据该签名构造你对其他信息的签名。数字签名方案包括:
生成公钥私钥对,私钥用于签名,必须安全保存;公钥可以公开,用于他人验证签名有效性
把信息和私钥作为输入,输出即为签名
使用公钥,信息和签名作为输入,进行验证
在实践中,我们往往通过对哈希值进行签名,这样可以实现对任意长度信息的签名。
详细过程可以阅读What is a Digital Signature?
以及非对称加密概述中的数字签名部分
2.4 数字证书
数字证书是非对称加密的又一个重要应用,据我所知在比特币系统中并没有直接应用。但也确实是个重要的概念,作为链圈币圈的人,如果感兴趣不妨了解下什么是数字证书?
推荐看这篇文章数字证书原理,讲的很清晰
3. Base58编码
Base58编码在比特币的密钥和地址的编码中被广泛使用,用来增强密钥或地址的可读性以及防止传输或转录过程中发生错误。
image.png
3.1 Base58 Encode
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
Base58是在base64编码的基础上得到的,去掉了容易混淆的字母(不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”),以及影响双击选择字符串的字母(”+”和”/”符号)。
我们首先要需要了解什么是Base64编码
然后再来学习base58编码
3.2 Base58Check Encode
而 Base58Check 编码其实就是在Base58编码的基础上,添加了校验的过程。流程并不复杂,如下图所示:
image.png其实上图已经将 Base58Check 编码的过程描述清楚了,更多的细节请参考: