(深度好文)区块链技术-比特币(二)

开场白

上一章给大家介绍了比特币是什么、比特币钱包种类以及各个比特币钱包如何操作,但想要深入了解比特币的原理,需要掌握到很多密码学知识,例如公钥、私钥、哈希、对称加密、非对称加密、数字签名等。

本章将从密码学的角度带大家了解更多比特币的知识!

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

01
比特币基本概念

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

区块链:一种去中心化的分布式账本,由一个个区块(block)组成。区块很像数据库的记录,每次写入,就创建了一个新的区块,写入后几乎无法更改。

公有链,任何人都可以参与使用和维护,信息公开,如比特币,以太坊等。

联盟链,若干组织共同维护,有权限限制,信息受保护,如超级账本Fabric。

私有链,被少数人管理控制,信息不公开。

区块:区块是一种被包含在公开账簿(区块链) 里的聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。

区块头:版本号,父区块哈希,Merkle树根,时间戳,难度值,nonce计数器。

区块体:包含一个或者多个交易的集合。

交易:coinbase交易是挖矿奖励所得,其他交易为转移比特币资产。

地址:接收发送比特币的的唯一标示,长度为34的字符串,主网中以1开头,例1CS8g7nwaxPPprb4vqcTVdLCuCRirsbsMb,测试网中以m或n开头。

公钥:公钥是从私钥通过椭圆曲线运算计算得来的,这个过程是不可逆的。也就是说通过私钥可以算出公钥,反之则不行。

私钥:私钥就是一个256位的随机数,取值处于1到n - 1之间,其中:n =2^256= 1.158 * 10^77;例如使用SHA256算法,就能很方便的生成256位随机数。

钱包文件:通常所说的钱包文件是 wallet.dat,存储了一批比特币地址和其历史交易信息,可以设置加密密码。

钱包密码:给钱包设置的密码和钱包的私钥不是同一个概念,钱包的密码相当于给你钱包上的所有私钥进行二次加密,如果设置了钱包密码,即便拿到存储私钥的wallet.dat文件,也无法查看文件里面私钥的信息。

比特币wallet.dat 和密码等价于比特币私钥。

02
密码学基础
2.2.1 对称加密

对称加密的加密密钥和解密钥相同,A选择某一种加密规则,对信息进行加密;B使用同一种规则,对信息进行解密。由于加密和解密使用同样的规则(简称“密钥”),这种加密方式被称为对称加密算法。

这种加密模式有一个最大缺点:甲方必须把加密规则告诉乙方,否则无法解密,这样在传输过程中无法确保密钥被安全传送,容易被窃取。

常用算法:DES、3DES(TripleDES)、AES等。

使用场景:网站API接口的数据传输。

2.2.2 非对称加密

非对称加密(公钥加密)发明于20世纪70年代。它是计算机和信息安全的数学基础。自从公钥加密被发明之后,一些合适的数学函数被提出,如:素数幂和椭圆曲线乘法。这些数学函数都是不可逆的,就是说很容易向一个方向计算, 但不可以向相反方向倒推。基于这些数学函数的密码学, 使得生成数字密钥和不可伪造的数字签名成为可能。

加密过程

(1)B生成一对密钥(公钥和私钥),公钥是公开的,可以发送给与他通信的任何人,私钥则是保密的,不能传送出去;

(2)A获得B的公钥,使用B的公钥对信息进行加密,然后将加密信息传送给B;

(3)B得到加密后的信息,用私钥进行解密。

在这个过程中,公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,双方的通信就是安全的。

公钥加密,私钥解密;公钥由私钥生成,私钥可以推导出公钥,从公钥无法推导出私钥。

常用算法:RSA、ECC(椭圆曲线加密算法)

使用场景:SSH安全验证。

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

2.2.3 哈希算法

Hash,直接音译为哈希,也有译做散列。就是把任意长度的输入,通过一定的算法,变换成固定长度的输出,该输出就是哈希值。

简单的说就是一种将任意长度的消息压缩到一固定长度的消息摘要的函数。

不可逆性:几乎无法通过哈希的结果推导出原文。

无碰撞性:两个不同原文哈希后的结果一定不同。

常用算法:MD5、SHA-256、SHA-512、RIPEMD-160

使用场景:用户密码存储(MD5),比特币挖矿(SHA256)

03
比特币私钥和公钥

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

2.3.1 生成私钥

私钥就是一个256比特的随机数。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。

私钥的格式:私钥可以有许多不同的格式表示, 所有这些都对应于相同的256比特的数字。私钥的三种常见格式如下。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

Base58编码

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

简单来说就是把编码后的文本数字串,转换成一个大整数,然后再按58进制表示出来。

Base58Check编码

一种常用在比特币中的Base58编码格式, 增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节, 添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的, 所以可以用来检测并避免转录和输入中产生的错误。

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

“双哈希”校验码,对前缀和数据运行两次SHA256哈希算法:checksum= SHA256(SHA256(prefix+data)),在产生的32个字节的哈希值中,取前4个字节作为校验码,添加到数据之后。对生成的结果(前缀、 数据和校验码)进行Base58编码。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

Bitcoin Explorer命令行工具

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

Hex 形式私钥

64位16进制串,长度为32字节,可以从256比特的二进制字符串转换而来。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

WIF形式私钥

在64位16进制串对应的字节串前加上前缀0x80,并用Base58Check编码。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

WIF compressed形式私钥

WIF-compressed就是在64位16进制串对应的字节串前加上前缀0x80,并加上后缀0x01,并用Base58Check编码。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

2.3.2 生成公钥

私钥经过SECP256K1的算法处理,可以生成了公钥。SECP256K1是一种椭圆曲线算法,通过一个已知的私钥,可以算得对应的公钥, 这是不可逆转的过程。但是,知道某一公钥,却无法反向计算出私钥。

椭圆曲线加密算法是一种基于离散对数问题的非对称(或公钥) 加密法, 可以用对椭圆曲线上的点进行加法或乘法运算来表达。

公钥也可以用多种不同格式来表示, 最重要的是它们分为非压缩格式或压缩格式公钥这两种形式。

公钥是在椭圆曲线上的一个点,由一对坐标(x,y)组成。公钥通常表示为前缀04紧接着两个256比特的数字。其中一个256比特数字是公钥的x坐标, 另一个256比特数字是y坐标。非压缩格式公钥前缀是04,压缩格式公钥前缀是02或者03。

非压缩格式公钥

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

前缀:04

x坐标:

98c39ac0d91ff4cea6e79ae5836e50868c47191bca0fbfd2a6838d303665f506

y坐标:

ad0a9ccb60c7758ce4c2759b8f7b0f731f0d8d90caf3778c4a65a0c53cf94210

非压缩格式公钥一共是520 bits (8 + 256 + 256),使用16进制字符串表示,要130个字节!

压缩格式公钥

引入压缩格式公钥是为了减少比特币交易的字节数,从而可以节省那些运行区块链数据库的节点磁盘空间。大部分比特币交易包含了公钥, 用于验证用户的凭据和支付比特币。每个公钥有520比特(包括前缀,x坐标,y坐标)。如果每个区块有数百个交易, 每天有成千上万的交易发生, 区块链里就会被写入大量的数据。

公钥是椭圆曲线上的一个点P(x, y),而按照椭圆曲线的方程,我们是可以通过x求得y的,所以我们只要保留x部分就可以了。公钥压缩的实现,若y是偶数,前缀为02,y是奇数,前缀为03,接上x的16进制字符串即可。

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

04
比特币地址

比特币地址是一个由数字和字母组成的字符串,可以发送给任何想给你比特币的人。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数字1开头。

公钥到公钥哈希的流程:

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

公钥哈希到比特币地址的流程:

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

非压缩格式公钥生成比特币地址的流程:

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

比特币纸钱包、脑钱包?原谅我脑内存不足(二)

本文由 链话题网 作者:Eileen 发表,文章内容系作者个人观点,不代表 链话题网 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论