WHCSRL 技术网

密码算法在比特币中的应用

比特币系统为了保证其安全性,用到了很多算法,包括各种加密算法以及共识算法,理解这些算法对于理解比特币的原理是至关重要的。首先理解一下比特币与区块链的关系。

1 比特币与区块链的关系

1.1 比特币怎么来的?

2008年,中本聪发表论文《比特币 :一种点对点的电子现金系统》。论文描述了

  • 如何创建一套去中心化的电子交易体系
  • 区块链正是构建这种电子交易体 系的底层技术

用的技术就是区块链。也就是说,比特币是世界上第一种“去中心化”的数字货币,为了发明它,中本聪搞出了一种新技术,他把它命名为“区块链”。因此,区块链是伴随着比特币产生的一种新技术。

通俗地说,比特币是产品,是一种具体的数字货币,而区块链是相对通用的技术

打个比方,瓦特发明了蒸汽机,他也发明了一整套相关的技术。但技术不是产品本身,别人用他的技术,也能做出相似的蒸汽机。

1.2 什么是区块链?

区块链是一种软件技术。说得简单点,就是“分散存储”和“档案全留”。也就是说,比特币的所有交易信息,在网上都有保留,而且是重复存储在成千上万台计算机上。

比如,A把比特币卖给了B,这条交易记录不是存储在一台计算机上,而是存储在网上尽量多的计算机上,至少几百台以上。而且,这些比特币过去所有的交易记录,也全都保留在网上。

这种分散存储和信息保留,让人极难篡改。因为如果想篡改交易记录,就得改成千上万台机器上的数据,这几乎是不可能的。迄今为止,还没有发生过篡改现象。因此,从实际应用角度来说,比特币是不可篡改和不可伪造的。加上它本身具有一定的成本和稀缺性,因此具有一定的信用。因此,比特币具有货币的特征。

2 比特币的特点

总结以下,比特币具有如下特点

  • 不依靠特定货币机构发行,基于特定的算法,通 过大量的计算产生;
  • 比特币经济使用P2P网络中的众多节点构成的分 布式数据库来确定并记录所有的交易行为;
  • P2P的去中心化特征与算法本身可以确保无法通 过大量制造比特币来人为操控币值。
比特币与传统虚拟币的区别
比特币传统虚拟货币(如Q币)
性质去中心化有一个服务商
公开交易度匿名交易公开,可追溯
存量存量有限无线增发
代码属性开源封闭
价值体现可直接购买商品

可直接购买虚拟商品,个别例外可购买实物商品

使用范围没有限定范围有限
兑换比率浮动固定

3 比特币的密码学原理

首先要明白比特币是如何获取的。获取方式通常有以下3种:

  1. 挖矿生产——制造一个新的比特币区块获得比特币;
  2. 进行购买——通过类似于网上交易平台(如火币网)进行交易;
  3. 捐赠获得——自由网、互联网、档案馆、自由软件基金会以及其他一些组织接收捐赠。

3.1 比特币原理 

比特币是一个分布式的点对点网络系统

  • 没有中央服务器,也没有中央发行机构
  • 完全通过点对点技术实现的电子现金系统
  • 可以不通过任何中间金融机构直接由一方发起并支付给另一方
  • 矿工通过“挖矿”来完成对交易记录的转账过程,维护网络的正常运行
  • 验证比特币交易的同时参与竞赛来解决一个数学问题
  • 提供公开可见的记账本
  • 记录发生过交易的历史信息,避免重放攻击,即某个合法交易被多次重新发送造成攻击。

3.2 比特币地址 

  • 公钥和私钥是一对
  • 公钥就是所谓的比特币地址
  • 你拥有的比特币数量=你拥有的所有的比特币地址上的所有比特币数量总和
  • 花币需要用对应比特币地址的私钥签名
  • 私钥没了,钱没了,你拥有了别人的私钥= 你拥有了别人的比特币
  • 你可以随便生成公私钥对,空间无限大

3.3 比特币地址的生成过程

  1. 随机选取32字节的数作为私钥
  2. 椭圆曲线加密算法得到非压缩公钥
  3. 依次计算SHA-256、RIPEMD-160值
  4. 上一结果前加地址版本号(0x00)
  5. 计算两次SHA-256
  6. 取前4个字节加到第4步结果后面
  7. 进行base58编码
  8. 获得比特币地址

由以上过程可以得到, 比特币系统为了保证其安全性,用到了很多算法,包括各种加密算法以及共识算法

3.4 比特币的主要技术

  • 密码哈希:区块链数据结构
  • 分布式共识协议:区块链验证
  • 数字签名:可证明的价值交换

4 几个主要算法技术的介绍

4.1 Hash算法

4.1.1 Hash的概念

Hash对于任何一个从事计算机软件开发的同行应该是在熟悉不过了。Hash算法是指将任意长度的一串明文映射为一段长度较短的(通常长度也是固定的)二进制串,并且对于不同的明文,很难映射得到相同的hash串。平时在开发过程中用的比较多的MD5来检验文件就是hash的最常见的应用:用某种hash算法对文件生成hash值(数字摘要),一旦之后文件发生了改变,重新计算将得到不同的摘要值,从而认为文件发生了变化。

一个好的hash算法需要具备的特点:

  1. 正向快速:对于给定的明文,能在有限的时间和资源内得到hash值;
  2. 逆向困难:对于给定的hash值,想逆向推导出明文基本不可能;
  3. 输入敏感:明文发生变化,新的hash值会有很大的不同;
  4. 抗碰撞性:很难找到两段不同的明文能够产生相同的hash值;

4.1.2 常见的hash算法

常见的hash算法:

  • MD4:该算法由Rivest于1990年设计,对于任意明文,能够输出128位的hash。MD4目前已经被证明为不安全的。
  • MD5:MD4的改进版,作者也是Rivest。同样输出128位的hash,相比MD4更加安全,但是速度稍慢。
  • SHA:SHA并非一个算法,而是一个算法族,由NIST(National Institute of Standards and Technology)于1993年发布了首个实现。该算法族包含了SHA-1,SHA-224,SHA-256,SHA-384,SHA-512等。

目前MD5和SHA1已经被破解,通常推荐使用SHA-256或更安全的算法。

4.2 加解密算法

比特币作为一种加密货币,其中少不了加解密算法。

4.2.1 加解密的过程   

加解密过程描述起来很简单:加密就是将明文和秘钥,通过加密算法生成密文。

解密是加密的反过程:密文和秘钥通过解密算法,还原出明文。

根据加密和解密过程中是否使用相同的秘钥,加密算法又可以分为对称加密和非对称加密算法:

  •     对称加密:加密和解密使用相同的秘钥。
  •     非对称加密:加密和解密使用不同的秘钥。

两种加密方式各有有缺点,实践中有时会将二者结合起来使用。  

注意:理论上不存在绝对安全的算法,所以在实际的项目中,如果对安全性要求较高,最好不要使用自己设计的加密算法,很多情况下即使不公开加密算法,系统也很容易被破解,明智的做法是使用已经经过长期验证和论证的算法。

4.2.2 对称加密算法

对称加密算法即加密和解密使用相同的秘钥。其优点是效率和加密强度高,但缺点是参与方需要提前持有秘钥,一旦有人将秘钥泄漏,就会有安全风险。

从实现方式上,对称加密算法又可以分为分组密码和序列密码。

  1. 分组密码:将明文以定长的数据块为加密单位,应用最为广泛。
  2. 序列密码:每次只对一个字节或字符加密。

分组密码应用较为广泛,有一些大家耳熟能详的经典算法:DES,3DES,AES。

  • DES:经典的加密算法,由美国联邦信息处理标准FIPS采用。将64位名为变为64位密文,秘钥长度64位。该算法目前已经可以被暴力破解,不再安全。
  • 3DES:顾名思义,采用3重DES加密,强度高于DES,但是目前也被证明是不安全的。
  • AES:由美国国家标准研究所采用,目前已取代了DES成为了对称加密实现的标准。AES的分组长度为128位、192位和256位,目前还没有有效的破解手段。

4.2.3 非对称加密算法

非对称加密算法是指加密和解密使用不同的秘钥,分别称为公钥和私钥。私钥一般通过随机数算法来生成,公钥通常通过私钥生成。公钥谁都可以看到,私钥不能泄露,只有自己持有。

非对称加密的优点是公私钥分开,缺点是效率低,强度也比对称加密低。

安全性方面,非对称加密的安全性需要数学问题来保障,常见的有大质数因子分解,椭圆曲线,离散对数等数学难题。

常见的非对称加密算法:

  • RSA:经典的公钥算法,利用了对大数进行质因子分解困难的特性;
  • Diffie-Hellman:秘钥交换,基于离散对数不能快速求解;
  • 椭圆曲线算法(ECC):这是目前关注度比较高的算法系列,也是比特币中使用的算法。基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。ECC算法目前被认为安全度高,但缺点是效率低,计算比较耗时。

一些非常重要的概念:

  1. 比特币中使用ECDSA算法的目的是为了证明某一笔比特币只能被其所有人花费;
  2. 私钥:需要保密,只有生成它的人才知道,私钥是一串随机数,在比特币中用32位整数保存;
  3. 公钥:和私钥对应的一串数字,公钥可以由私钥计算生成(但不强制),公钥的作用是在不暴露私钥的情况下验证签名的有效性;
  4. 签名:签名由私钥加上需要被签名的数据的hash(数据摘要)生成。通过公钥加上某种数学算法,就能在不暴露私钥的情况下对签名进行验证。本部分参考原文链接

4.3 数字签名

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称与数字摘要技术的应用。本部分参考原文链接

公钥密码系统的签名原理

4.4 共识算法

 区块链是一种去中心化的分布式账本系统,可以用于登记和发行数字化资产、产权凭证、积分等,并以点对点的方式进行转账、支付和交易。区块链系统与传统中心化系统相比,具有公开透明、不可篡改、防止多重支付等优点,并且不依赖于任何的可信第三方。

由于点对点网络下存在较高的网络延迟,各个节点所观察到的事务先后顺序不可能完全一致。因此,区块链系统需要设计一种机制对在差不多时间内发生的事务的先后顺序进行共识。这种对一个时间窗口内的事务的先后顺序达成共识的算法被称为“共识机制”。

在区块链这样的分布式账本系统中,保障整个系统的安全性和适应性十分重要,这也是共识算法出现的根本原因。

那么,区块链中常见的共识算法都有哪些呢?

1、POW:Proof of Work,工作量证明

POW是比特币在Block的生成过程中使用的一种共识算法,也可以说是最原始的区块链共识算法了。POW工作量证明,简单地理解就是,通过一份证明来确认做过一定量的工作。

在比特币系统中,得到合理的Block Hash需要经过大量尝试计算。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算。

这种工作量证明的形式,在我们日常生活中也十分常见。比如驾照,能拿到驾照,说明你已经进行过为期几个月甚至几年的练车和考试;再比如现在很火的吃鸡和王者荣耀游戏中的K/D(Kill/Death)和胜率,分值越高证明你越厉害,同时也说明你进行了大量的游戏练习和技巧学习。

2、POS:Proof of Stake,权益证明

由于POW机制存在消耗算力巨大、交易确认时间较长,挖矿活动集中容易形成中心化等缺点,便演进出了POS权益证明。POS简单来说,就是一个根据持有数字货币数量和时间来分配相应利息的制度,类似平时我们在银行中存款。

基于权益证明共识的区块链系统中,参与者的角色是验证者Validator,只需要投资系统的数字货币并在特定时间内验证自己是否为下一区块创造者,即可完成下一区块的创建。下一区块创造者是以某种确定的方式来选择,验证者被选中为下一区块创造者的概率与其所拥有的系统中数字货币的数量成正比例,即拥有300个币的验证者被选中的概率是拥有100个币验证者的3倍。

在POS模式下,有一个名词叫币龄,每个币每天产生1币龄。比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000。这个时候,如果你验证了一个POS区块,你的币龄就会被清空为0,同时从区块中获得相对应的数字货币利息。

这下就很有意思了,持币有利息。并且由于POS是在一个有限的空间里完成,不是像POW那样在无限空间里寻找,因此无需大量能源消耗。

3、DPOS:Delegated Proof of Stake,授权权益证明

DPOS最早出现在比特股中,又称受托人机制,它的原理是让每一个持有比特股的人进行投票,由此产生101位代表 。我们可以将其理解为101个超级节点或者矿池,而这101个超级节点彼此的权利完全相等。

从某种角度来看,DPOS有点像是议会制度或人民代表大会制度。如果代表不能履行他们的职责(当轮到他们时,没能生成区块),他们会被除名,网络会选出新的超级节点来取代他们。DPOS的出现最主要还是因为矿机的产生,大量的算力在不了解也不关心数字货币的人身上,类似演唱会的黄牛,大量囤票而丝毫不关心演唱会的内容。

DPOS通过其选择区块生产者和验证节点质量的算法确保了安全性,同时消除了交易需要等待一定数量区块被非信任节点验证的时间消耗。通过减少确认的要求,DPOS算法大大提高了交易的速度。通过信任少量的诚信节点,可以去除区块签名过程中不必要的步骤。

4、PBFT:Practical Byzantine FaultTolerance,实用拜占庭容错

PBFT意为实用拜占庭容错算法,该算法由Miguel Castro (卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来,解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。

PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。

将所有的副本组成的集合使用大写字母R表示,使用0到|R|-1的整数表示每一个副本。为了描述方便,假设|R|=3f+1,这里f是有可能失效的副本的最大个数。尽管可以存在多于3f+1个副本,但是额外的副本除了降低性能之外不能提高可靠性。

5、RAFT,一致性共识算法

RAFT算法包含三种角色,分别是:跟随者(follower),候选人(candidate)和领导者(leader)。集群中的一个节点在某一时刻只能是这三种状态的其中一种,这三种角色可以随着时间和条件的变化而互相转换。

RAFT算法主要有两个过程:一个过程是领导者选举,另一个过程是日志复制,其中日志复制过程会分记录日志和提交数据两个阶段。RAFT算法支持最大的容错故障节点是(N-1)/2,其中N为集群中总的节点数量。

上述是目前主要的区块链共识算法,当然还有其他算法,比如POET:Proof of Elapsed Time流逝时间量证明,Ripple Consensus瑞波共识机制等。

每种算法,各有千秋,在特定环境下和时间段上被采用都有各自的考虑和意义。对不同的区块链应用场景而言,适合的算法即为最好的算法。​​​​​​原文链接

推荐阅读