mt logoMyToken
Market cap:
0%
FGI:
0%
Cryptocurrencies:--
Exchanges --
ETH Gas:--
EN
USD
APP
Ap Store QR Code

Scan Download

干货| 比特币背后的密码学原理

Collect
Share

目录:

序言

一.      密码学理论

二.      比特币实战

三.      区块链

四.      挖矿原理

五.      总结

比特币背后的密码学原理(连载一)

二、比特币实践

从现在开始,我们开始真刀实枪了,先看看比特币的编码世界。

1.Base58和Base58Check编码

这里请允许我拿来主义,我觉得王秒等多位老师翻译的Andreas M. Antonopoulos所著《精通比特币》对这个问题已经解释的很清楚了,更详细的描述还可以看看这里。

为了更简洁方便地表示长串的数字,许多计算机系统会使用一种以数字和字母组成的大于十进制的表示法。例如,传统的十进制计数系统使用0-9十个数字,而十六进制系统使用了额外的 A-F 六个字母。一个同样的数字,它的十六进制表示就会比十进制表示更短。更进一步,Base64使用了26个小写字母、26个大写字母、10个数字以及两个符号(例如“+”和“/”),用于在电子邮件这样的基于文本的媒介中传输二进制数据。Base64通常用于编码邮件中的附件。Base58是一种基于文本的二进制编码格式,用在比特币和其它的加密货币中。这种编码格式不仅实现了数据压缩,保持了易读性,还具有错误诊断功能。Base58是Base64编码格式的子集,同样使用大小写字母和10个数字,但舍弃了一些容易错读和在特定字体中容易混淆的字符。具体地,Base58不含Base64中的0(数字0)、O(大写字母o)、l(小写字母L)、I(大写字母i),以及“+”和“/”两个字符。简而言之,Base58就是由不包括(0,O,l,I)的大小写字母和数字组成。

需要注意的是,Base58编码是不含校验信息的,Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节,添加到需要编码的数据之后。

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

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

checksum = SHA256(SHA256(prefix+data))

在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。结果由三部分组成:前缀、数据和校验码。

2.密钥、地址与钱包

先说结论:

1.密钥通常指的是保护比特币资产的对应于所有权用户的私钥,个别时候也会模糊的统称私钥和公钥为密钥,这里我们以狭义的私钥解释为准。

2.地址大部分情况下是指对公钥的封装(个别时候除了公钥还有脚本)。

3.钱包是私钥的容器,通常通过有序文件或者简单的数据库实现。比特币钱包包含私钥和公钥数据,尽管公钥数据理论是是不需要存储的。

2.1私钥保护

私钥必须保密。私钥的机密性需求事实情况是,在实践中相当难以实现,因为该需求与同样重要的安全对象可用性相互矛盾。当你需要为了避免私钥丢失而存储备份时,会发现维护私钥私密性是一件相当困难的事情。通过密码加密内有私钥的钱包可能要安全一点,但那个钱包也需要备份。有时,例如用户因为要升级或重装钱包软件,而需要把密钥从一个钱包转移到另一个。私钥备份也可能需要存储在纸张上(参见“4.5.4 纸钱包”一节)或者外部存储介质里,比如U盘。但如果一旦备份文件失窃或丢失呢?这些矛盾的安全目标推进了便携、方便、可以被众多不同钱包和比特币客户端理解的加密私钥标准BIP0038的出台。

BIP0038提出了一个通用标准,使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。这个加密标准使用了AES,这个标准由NIST建立,并广泛应用于商业和军事应用的数据加密。

2.2公钥与地址

我们知道比特币协议的区块链实际上是对交易的维护而不是对账户的维护,交易数据本身并不需要私钥,因此对公钥的封装也就是地址就显得格外重要,需要兼顾安全,效率和扩展。

从公钥到地址经历了如下过程:

A = RIPEMD160(SHA256(K))

公式中,K是公钥,A是生成的比特币地址。比特币地址与公钥不同。比特币地址是由公钥经过单向的哈希函数生成的

以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160 哈希值,得到一个长度为160比特(20字节)的数字后进行Base58Check编码即可得到比特币地址。从编码数据结构的视角看,是下图:

需要注意的是,从地址已经无法反推公钥信息,因此,需要将私钥以及对应的公钥、地址一起存储。

2.3比特币钱包

比特币钱包要解决的核心问题是私钥管理,早期的方式是随机生成私钥池并一次一密,这当然是安全性很高的方案。但是对存储,导入导出备份带来了极大的挑战,毕竟私钥丢了谁也没有办法。改进的私钥管理办法将私钥链式管理起来了,见下图:

生成链式结构的过程如下:

Disclaimer: The copyright of this article belongs to the original author and does not represent MyToken(www.mytokencap.com)Opinions and positions; please contact us if you have questions about content