常用的加解密算法
常用的加解密算法有三类:对称加密算法、非对称加密算法以及hash加密算法。
在比特币中用到了非对称加密技术中的椭圆曲线来生成公私钥,以及hash算法中的SHA256来完成数字签名和PoW共识
对称加密算法
指加密和解密需要用相同密钥的加密算法。优点在于加解密的速度和使用长密钥时的难破解性。
缺点在于大量密钥的分发和管理:
假设企业有N人,如果需要任意两人间传输信息使用不同的密钥,那么密钥的数量为n(n-1).
适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。
常见的对称加密算法有DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES.
- DES(Data Encryption Standard) 数据加密标准,速度较快,适用于加密大量数据的场合。
- 3DES(Triple DES) 基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
- AES(Advanced Encryption Standard)高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
DES入口参数
DES算法的入口参数有三个:Key、data、mode;key是工作密钥7个字节56位,data是需要加解密的数据8个字节64位,mode区分是加密或解密。
DES基本原则
设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。
混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,使解密着无法从明文和密文的对应关系中寻找出他们与密钥之间的关系。
比如二战时期图灵就是通过分析出报文开头固定的字符串“today is sunday”找到了明文和密文之间的规律,从而逐步破译了敌军的密码。
所以我们可以推断纳粹的Enigma机器没有使用“混淆”原则。😄
扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,通俗地讲就是明文或密钥某一位发生变化时对应的密文将引发“雪崩现象”,面目全非。
可以用"揉面团"来形象地比喻扩散和混淆,通过乘积和迭代或者将密钥置换为子密钥再与明文混乱置换、结构交叉互换等以取得比较好的扩散和混淆的效果。
3DES是DES向ADES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密,目前还没有关于攻破3DES的报道。
AES对称加密
AES支持三种长度的密钥:128位,192位,256位
平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用,Key的长度决定了AES加密的轮数。
除去初始轮,各种Key长度对应的轮数如下:
AES128:10轮
AES192:12轮
AES256:14轮
初始轮只有一个步骤:
加轮密钥(AddRoundKey)
普通轮有四个步骤:
字节代替(SubBytes)
行移位(ShiftRows)
列混淆(MixColumns)
加轮密钥(AddRoundKey)
最终轮有三个步骤:
字节代替(SubBytes)
行移位(ShiftRows)
加轮密钥(AddRoundKey)
1.字节替代(SubBytes)
所谓字节替代,就是把明文块的每一个字节都替代成另外一个字节。替代的依据是什么呢?依据一个被称为S盒(Subtitution Box)的16X16大小的二维常量数组。
-
行移位(ShiftRows)
-
列混淆(MixColumns)
这一步,输入数组的每一列要和一个名为修补矩阵(fixed matrix)的二维常量数组做矩阵相乘,得到对应的输出列。
4.加轮密钥(AddRoundKey)
这一步是唯一利用到密钥的一步,128bit的密钥也同样被排列成4X4的矩阵。
让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]。
AES加密示意图:
加密时使用的模式和解密的模式必须相同
所有工作模式的区别只在于明文块和明文块之间的关联,加密器内部的工作逻辑都是一样的。
分组加密模式一
ECB模式利于并行计算,但是没有使用“混淆”原则,无法隐藏明文的规律。
分组加密模式二
CBC模式安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
不利于并行计算,误差会一直传递下去。
分组加密模式三
分组加密模式四
非对称加密算法
指加密和解密使用不同密钥的算法,优点在于加密密钥的分发将变得十分简单:如果企业中有n个用户,企业只需要生成n对密钥,分发并公开n个公钥,用户只要保管好自己的私钥即可;同时,所有的消息都是经过唯一私钥签名的。
非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。
在 1976 年,由于对称加密算法已经不能满足需要,Diffie 和 Hellman 发表了一篇叫《密码学新动向》的文章,介绍了公匙加密的概念,由 Rivet、Shamir、Adelman 提出了 RSA 算法。RSA 就是他们三人姓氏开头字母拼在一起组成的。
常见的非对称加密算法:RSA、ECC(因为对带宽要求低,主要移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
RSA加密算法为目前地球上最安全的算法
其背后的数论基础为欧拉定理
RSA与量子计算:
若要破解一组2048位的RSA加密,大约需要4000个量子位元(qubit)。目前Google和IBM的量子机约有20个量子位元。尽管数量仍远远不足,但是相较2016年的9位元和5位元,数量都提升了两倍。未来的量子计算是否会对目前的加密算法引发系统性革命,让我们拭目以待吧。
比特币使用椭圆曲线算法ECC生成公钥和私钥
ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:
- 抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
- 计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
- 存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
- 带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
ECC加密算法详见什么是椭圆曲线加密.
Hash加密算法
Hash算法是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。
优秀的Hash算法需要具备以下几点:
1. 正向快推:给定明文和Hash算法,在有限时间和有限资源内能计算出Hash值
2. 逆向困难:给定Hash值,在有限时间内很难(基本不可能)逆推出明文
3. 输入敏感:原文发生一点不同,Hash值都会看起来有巨大变化
4. 冲突避免:基本找不到两条Hash值一样的明文
所以Hash算法常于不可还原(因为逆向困难)的密码存储、信息完整性(因为输入敏感)校验等。
Hash算法一般都是算力敏感型,意味着计算资源是瓶颈,主频越高的CPU运行Hash的速度也越快。
但也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。
目前流行的Hash算法有:MD5、SHA1和SHA2,MD是Message Digest的缩写。
MD5算法底层原理拢共分四步:
第一步:处理原文
首先,我们计算原文长度(bit)对512取模的结果,如果不等于448(512-64=448)补齐至448,补齐部分首位置1其余置0,再取64位于末尾用于记录原文长度,于是原文M被处理为:M=512*(N+1)的长度,再将这(N+1)段原文的每一段512位拆成16组,每组32位,分别计为M0~M15
第二步:设置初始值
MD5的哈希值长度为128位,拆成4组每组32位,这4组结果分别由A、B、C、D的初始值和原文处理后的(N+1)组M0~M15值通过循环演化得到。
MD5的官方实现中,A、B、C、D的初始值如下:
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
第三步:循环演化
每一次循环都会让旧的ABCD产生新的ABCD,由于原文被拆分成每组32位共4*(N+1)组的字符串,且MD5需要使用4种不同的线性函数进行循环,所以共循环4*16*(N+1)次,4种线性函数如下:
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =XYZ
I(X, Y, Z)=Y^(X|(~Z))
下图代表了单次A,B,C,D值演变的流程:
其中:
- F代表线性函数
- 红色的田字代表相加的意思。
- Mi为M0~M15
- Ki是一个每一次循环计算都取不同值的常量
- S代表左移S位,也是常量
在单次演变后A、B、C、D的结果分别为:
新A = 原d
新B = b+((a+F(b,c,d)+Mj+Ki)<<<s)
新C = 原b
新D = 原c
第四步:拼接结果
这一步就很简单了,将循环演化后的ABCD拼接,即是最后128位的Hash结果。
由于MD5可以被暴力枚举、字典法、彩虹表法等碰撞破解,安全性已不足以商用。
而SHA1,SHA2(包括SHA-256、SHA-224、SHA-512、SHA-384等,只是生成的摘要长度不同)和MD5的原理类似,不同在于摘要长度的不同导致发生碰撞的几率和耗费的性能及占用的空间。
数字摘要
数字摘要是HASH算法的一个重要用途,在网络上下载软件或文件时,往往同时会提供一个数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确保内容没有被修改过。
比特币中的数字签名
数字签名由数字摘要+非对称加密技术组成,在比特币中使用的数字摘要算法是SHA256,使用的非对称算法是椭圆曲线加密ECC
- 用SHA256对交易信息进行摘要加密
- 用自己的私钥对摘要进行加密,形成数字签名
- 将完整的交易信息和数字签名一起广播给矿工
- 矿工用公钥对信息进行验证,验证成功即确认了交易发起方和交易内容无误
比特币中的挖矿
其实挖矿就是通过碰撞出一个给定SHA256摘要的过程
- 已知下一个区块中将要记录交易信息的摘要值m
- 找到一个数字n,使得m+n通过SHA256运算后前四位为0
第一个找到n的节点将获得记账权,并获得此区块中所有交易的手续费和记账奖励。
另:混合加密机制
先用计算复杂度高的非对称加密协商一个临时的对称加密密钥(会话密钥,一般相对内容来说要短的多),然后双方再通过对称加密对传递的大量数据进行加解密处理。
典型的场景是现在大家常用的HTTPS
机制。HTTPS 实际上是利用了 Transport Layer Security/Secure Socket Layer(TLS/SSL)来实现可靠的传输。TLS 为 SSL 的升级版本,目前广泛应用的为 TLS 1.0,对应到 SSL 3.1 版本。
建立安全连接的具体步骤如下:
- 客户端浏览器发送信息到服务器,包括随机数 R1,支持的加密算法类型、协议版本、压缩算法等。注意该过程为明文。
- 服务端返回信息,包括随机数 R2、选定加密算法类型、协议版本,以及服务器证书。注意该过程为明文。
- 浏览器检查带有该网站公钥的证书。该证书需要由第三方 CA 来签发,浏览器和操作系统会预置权威 CA 的根证书。如果证书被篡改作假(中间人攻击),很容易通过 CA 的证书验证出来。
- 如果证书没问题,则用证书中公钥加密随机数 R3,发送给服务器。此时,只有客户端和服务器都拥有 R1、R2 和 R3 信息,基于 R1、R2 和 R3,生成对称的会话密钥(如 AES 算法),后续通信都通过对称加密进行保护。