壹 对称加密算法介绍
对称加密:指双方使用同一个密钥,既可以加密,也可以解密,可以看出这个密钥不能被其他人知道,只能是对应的人,这个就会造成如果要和多个人进行数据传输,那么保管大量的密钥和密钥传输就成为对称加密的两个致命问题。
特点:
- 优点:加密效率高,加解密速度快,通常发送大量数据时使用
- 缺点:加密强度低,密钥分发困难,因为需要约定好相同的密钥,而且若与多个用户发送数据,都需要不同的密钥,就需要保管大量的密钥成为负担
贰 DES——数据加密标准
2.1 概念
DES(Data Encryption Standard,即标准加密算法)是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。慢慢的被暴力破解,后来RSA公司举办过破译DES密钥的比赛,使得DES现在可以在短时间内被破译,因此一般情况下除了用它来解密之前的密文以外,基本上不会用DES加密。(百度的)
2.2 原理分析
密钥长度——DES是一种将64位的明文加密成64位的密文的对称密码算法,它的密钥长度是56位。尽管从规格上来说,DES的密钥长度是64位,但由于每隔7位会设置一个用于错误检查的校验位比特,因此实质上其密钥长度是56位。
数据分组长度——DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组,或者叫块。一般来说,以分组为单位进行处理的密码算法称为分组密码(blockcipher),DES就是分组密码的一种。所以DES每次只能加密64比特的数据,如果要加密的明文比较长,就会对明文进行64比特为单位分组切割,切割完后,再对其进行DES加密,然后反复迭代,而迭代的具体方式就称为后面说的分组模式(mode)。
可以看到密钥提供了64比特,但实际上只用了56比特,而且明文是64比如,密文也是64比特。
2.3 特点
- 不安全,一般情况下除了用它来解密之前的密文以外,基本上不会用DES加密
- 密钥为64比特,也就是8字节,但实际上只用了56比特,因为每7个比特会设置一个校验位
- 分组加密,分组最小单位也是64位,注意这是数据的分组不是密钥
- 加解密效率高
叁 3DES——三次数据加密标准
3.1 概念
现在DES已经可以在现实的时间内被暴力破解,因此我们需要一种用来替代DES的分组密码, 三重DES就是出于这个目的被开发出来的。3DES(Triple Data Encryption Standard)是为了增加DES的强度,将DES重复3次所得到的一种密码算法,通常缩写为3DES。
3.2 原理分析
3DES加密的原理就是分别用3个不同的密钥对数据依次进行DES加密、DES解密、DES加密操作,本质是是进行了三次加密,为什么怎么说呢?虽然中间用了解密,但是3次使用的密钥都不同,这就导致虽然是对数据进行了解密,但是解不回去,所以是进行了三次加密,==中间使用解密的原因是为了兼容以前的DES==。
3DES解密的原理与3DES加密差不多,即:分别用3个不同的密钥对数据依次进行DES解密、DES加密、DES解密操作,本质是是进行了三次解密。
3DES的密钥应该是24字节,因为需要三个不同的DES密钥,但是3DES的数据分组长度与DES相同为8字节。
对于密钥会出现以下情况:
- 如果秘钥1与秘钥相同,或者秘钥2与秘钥3相同,这就相当于DES
- 如果秘钥1与秘钥3相同,相当于有两个秘钥,专业名字:3DES-EDE2
- 如果三个秘钥都不相同,专业名字:3DES-EDE3
3.3 特点
- 相对安全
- 密钥为192比特,也就是24字节
- 分组加密,分组最小单位也是64位
- 加解密效率低
肆 AES——高级加密标准
4.1 概念
AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称密码算法。全世界的企业和密码学家提交了多个封称密码算法作为AES的候选,最终在2000年从这些候选算法中选出了一种名为Rijndael的对称密码算法,并将其确定为了AES。Rindael是由比利时密码学家Joan Daemen和Vincent Rijmen设计的分组密码算法,今后会有越来越多的密码软件支持这种算法。
4.2 原理分析
Rijmen设计出来的AES分组长度为128比特,密钥长度可以以32比特为单位在128比特到256比特的范围内进行选择,但是在AES的规格中,密钥长度只有128、192和256比特三种。可以看到AES的密钥长度是变化的,而且数据分组长度变成了128比特(16字节),加解密流程就和DES差不多!
4.3 特点
- 较为安全
- 密钥长度是可选的,有16字节、24字节、32字节三种
- 分组加密,分组长度为16字节
- 加解密效率高,推荐使用
伍 三种对称加密算法总结
- 对称加密算法使用的加解密密钥是样同
- 在一定程度上实现了数据的机密性,且简单、快速
- 但是由于算法一般都是公开的,因此机密性几乎完全依赖于密钥
加密算法名字 | 密钥长度 | 分组长度 |
---|---|---|
DES | 8字节 | 8字节 |
3DES | 24字节 | 8字节 |
AES | 16字节、24字节、32字节 | 16字节 |
陆 分组模式
6.1 分组模式概念
为什么要分组?上面说到的加密算法只是单单对算法的最小分组单位长度进行说明的,但是一般情况下数据并不是8字节、16字节或者是24字节,而是其以上,这时候我们就需要进行分组处理,分组处理并不是简单的将其分割,而是需要将这些分组进行迭代反复处理,这就涉及到分组模式的概念!
这里有一个概念叫明文分组和密文分组:
- 明文分组是指分组模式中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
- 密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。
- 需要区别的是明文分组不一定是加密算法的输入值,也就是说明文分组与加密算法的输入值不是一个概念,这个可能会有点绕,但是连接模式后就会明白了,加密算法的输入值可能是一个密钥值iv,也可能是用户的数据由于没有直接对明文分组进行加密,所以不需要填充,其实这里我绕了半天,后来想想确实是,假设最后一个明文分组只有1位,那么只要取加密后的密文的1位进行异或就可以了,后面的七位就可以不需要关注
- 而且分组模式的分组长度与加密的分组长度是不同的概念,但是为啥很多模式的分组长度都取决与算法的分组长度呢?是因为模式的分组长度实际是用户的数据,通常模式都是进行直接加密或者进行异或,这个时候就需要所有的数据都必须确保有一一对应的坑位,例如分组模式的分组长度比算法分组长度多,那么多出来的那一位就无法运算了,如果分组模式的分组长度比算法分组长度少,那少的那部分对于算法分组并无任何意义,但是有几个模式的最后一组就是属于后面这种情况
为了描述简单后面说的加密均表示使用三个加密模式其中任意一种。
6.1 五种分组模式概念
分组模式有五种:ECB、CBC、CFB、OFB、CTR,其中推荐使用的是CBC、CTR。
简称 | 名称 | 使用情况 |
---|---|---|
ECB | Electronic Coding Book,电子密码本模式 | 不使用,淘汰 |
CBC | Cypher Block Chaining,密文分组链接模式 | 常用 |
CFB | Cypher FeedBack,密文反馈模式 | 也有使用,建议使用CTR |
OFB | Output FeedBack,输出反馈模式 | 也有使用,建议使用CTR |
CTR | Cont,计数器模式 | 建议使用 |
6.2 加密算法与分组模式关系
柒 ECB——电子密码本模式
7.1 概念
ECB(Electronic Code Book,电子密码本)模式是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。
7.2 原理分析
ECB模式的原理就是将明文数据根据使用的加密算法规定分组长度,来分成固定大小的块(分组),并且每个块被单独加密。每个块的加密和解密都是独立的,且使用相同的加密算法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据。
为了描述简单后面说的加密均表示使用三个加密模式其中任意一种。
可以看到明文分组与密文分组是一一对应的,可以并行的,即加密明文分组1的同时也可以加密明文分组2,但是如果在最后一组时,出现数据不满足算法需要的数据长度时,怎么办呢?那就需要进行填充,就需要加额外数据,补全最后一组数据使其符合算法需要的数据长度。
使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的明文分组==》密文分组的对应表,因此ECB模式也称为电子密码本模式,当最后一个明文分组的内容小于分组长度时,需要用一特定的数据进行填充(padding),让最后的值成为一个分组长度。
ECB模式是所有模式中最简单的一种。ECB模式中,明文分组与密文分组是一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。
7.3 特点
- 加密效率高,但是安全性比较差,加密不彻底
- 加密前需要把明文数据填充到块大小的整倍数
- 每一个分组独立的进行加解密,一一对应
- 只要有一个分组被破解,所有的分组都被破解
- 不推荐使用,Go语言不支持这种分组模式
- 分组长度由加密算法决定,这里说的分组长度是模式的分组长度(DES为8字节,AES为16字节)
捌 CBC——密文分组链接模式
8.1 前言
CBC模式需要用到按位操作的异或运算,这里说明一下按位操作:
按位操作符 | 口诀 | |
---|---|---|
与 | & 或者and |
全真为真,有假为假 |
或 | ` | 或者 or` |
非 | ~ 或者! |
要么是假,要么是真 |
异或 | ^ 或者XOR |
相同为假,不同为真 |
# 与运算
0000 1001
0010 1000
----&----
0000 1000
# 或运算
0000 1001
0010 1000
----|----
0010 1001
# 非运算
0000 1001
----~----
1111 0110
# 异或运算,可以发现异或运算是不管与哪个都可以倒退的
0000 1001
0010 1000
----^----
0010 0001
异或是一个比较重要的概念!需要非常熟悉!
8.2 概念
CBC(Cipher Block Chaining,密文分组链接)模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与ECB一样消息块必须填充到块大小的整倍数。
8.3 原理分析
CBC模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量iv
进行异或操作。
可以看到其加密的过程是串连的,只要其中一个环节数据改变,后面的所有数据都会不一样,即加密一定是串行的,但是由于解密时需要解密的密文与前一个密文是已知的,所以解密是可以并行的!
如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别。ECB模式只进行了加密,而CBC模式则是在加密之前进行了一次XOR。明文分组在加密之前一定会与前一个密文分组进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
8.4 特点
- 分组长度由加密算法决定
- 需要提供初始化向量(Initialize Vector),同时初始化向量长度必须与分组长度相同
- 每一个密文都是下一次加密操作的输入,第一次的加密操作的输入是初始化向量
- 由于是链式架构不能够并行加密,但可以并行解密
- 加密强度高
- 加密前需要把明文数据填充到块大小的整倍数
玖 CFB——密文反馈模式
9.1 概念
CFB(Cipher FeedBack,密文反馈模式)模式与CBC模式差不多,只是颠倒了一下异或运算与加密算法的顺序,换一种说法就是通过对密文使用加密算法的得到的输出反馈到异或的输入中。
9.2 原理分析
CFB模式与CBC模式差不多,就是将异或运算与加密算法的顺序调换了,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。所谓反馈,这里指的就是返回输入端的意思,这里是让密文进行反馈,所以叫密文反馈,即前一个密文分组会被送回到密码算法的输入端。
CFB模式的解密和CBC模式的加密在流程上其实是非常相似的。
在ECB模式和CBC模式中,明文分组都是通过加密算法进行加密的,然而,在CFB模式中,明文分组并没有通过密码算法来直接进行加密,加密的是上一次的密文,而不是本次的明文。从上图可以看出,在CFB模式中,明文分组和密文分组之间并没有经过加密这一步骤,只有一个XOR,而且CFB的解密过程也没有使用解密算法。我们将CBC模式与CFB模式对比一下,就可以看出其中的差异了。在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间则只有XOR。
可以看出两个模式的最大区别就是加密算法位置与异或位置替换了!
9.3 特点
- 分组长度由加密算法决定
- 需要提供初始化向量(Initialize Vector),同时初始化向量长度必须与分组长度相同
- 先对密文进行加密,然后再与明文分组进行异或,区别与CBC模式
- 由于没有直接对明文分组进行加密,所以不需要填充,其实这里我绕了半天,后来想想确实是,假设最后一个明文分组只有1位,那么只要取加密后的密文的1位进行异或就可以了,后面的七位就可以不需要关注,没意义
- 解密时由于密文和密文间不存在加密过程,所以不需要使用解密算法
拾 OFB——输出反馈模式
10.1 概念
OFB(Output-Feedback,输出反馈模式)模式是通过对初始向量使用加密算法的得到的输出反馈到加密算法的输入中,以此进行循环,即上一个分组密码算法的输出是当前分组密码算法的输入。
10.2 原理分析
OFB模式是通过加密算法的输出反馈到加密法的输入中,即上一个分组密码算法的输出是当前分组密码算法的输入,也就是说OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将明文分组和密码算法的输出进行异或来产生密文分的,在这一点上OFB模式和CFB模式非常相似。
可以看到加密算法加密的是前一个加密算法的输出,而且只是对初始化向量进行不断加密,所以是输出进行反馈。
可以看到OFB与CFB最大的区别就在于反馈的输入值是什么!
10.3 特点
- 分组长度由加密算法决定
- 需要提供初始化向量(Initialize Vector),同时初始化向量长度必须与分组长度相同
- 不断对初始向量的输出进行加密,从而得到异或的输入数据来源
- 由于没有直接对明文分组进行加密,所以不需要填充
拾壹 CTR——计数器模式
11.1 概念
CTR(CounTeR,计数器模式)模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
11.2 原理分析
CTR模式其实很简单就是每个分组都有对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的。
- 计数器的生成方法
每次加密时都会生成一个不同的值(nonce)来作为计数器的初始值。当分组长度为16字节时,计数器的初始值可能是像下面这样的形式。其中前8个字节为nonce(随机数),这个值在每次加密时必须都是不同的,后8个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化:
按照上述生成方法,可以保证计数器的值每次都不同。由于计数器的值每次都不同,因此每个分组中将计数器进行加密所得到的密钥流也是不同的。也是说,这种方法就是用分组密码来模拟生成随机的比特序列。
可以看出来CTR模式和OFB模式一样,都属于流密码。如果我们将单个分组的加密过程拿出来,那么FB模式是将加密的输出反愦到输入,而CTR模式则是将计数器的值用作输入。.
11.3 特点
- 分组长度由加密算法决定
- 需要一个逐次累加的计数器,同时初始化向量长度必须与分组长度相同
- 由于没有直接对明文分组进行加密,所以不需要填充
- 可以并行加密和并行解密,效率高,推荐使用
拾贰 分组模式总结
模式名称 | 优点 | 缺点 | 备注 |
---|---|---|---|
ECB模式 | * 简单、快速* 支持并行计算(加解密均可) | * 明文中的重复排列会反映在密文中* 通过删除、替换密文分组可以对明文进行操作* 对包含某些比特错误的密文进行解密时,对应的分组会出错* 不能抵御重放攻击* 需要填充 | 不建议使用 |
CBC模式 | * 明文的重复排列不会反映在密文中* 支持并行计算(仅解密)* 能够解密任意密文分组 | * 加密不支持并行计算* 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错* 需要填充 | 推荐使用 |
CFB模式 | * 不需要填充* 支持并行计算(仅解密)* 能够解密任意密文分组 | * 加密不支持并行计算* 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错* 不能抵御重放攻击 | 不推荐使用 |
OFB模式 | * 不需要填充* 可事先进行加密、解密的准备* 加密、解密使用相同结构* 对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错 | * 不支持并行计算* 主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 | 不推荐使用 |
CTR模式 | * 不需要填充* 可事先进行加密、解密的准备* 加密、解密使用相同结构* 对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错* 支持并行计算(加解密均可) | 主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 | 推荐使用 |