密码学工具1——对称加密算法(AES总结最全版)

对称加密算法介绍

        对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的数据块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。

如上图发送方使用该密钥对信息进行加密,接收者使用同样的密钥对信息进行解密。

        对称加密算法拥有着算法公开、计算量小、加密速度和效率高得特点,但是也有着密钥单一、密钥管理困难等缺点。目前国际主流的对称加密算法是AES,国内主推的则是国标的SM4。

        常见的对称加密算法有 AES、SM4、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6、Camellia

对称加密算法的应用场景如下:

  • 网络通信
  • 文件加密存储
  • 数据库加密
  • 数字签名
  • 数字认证

AES加密

        AES 数据加密是一种在数学上更高效、更优雅的加密算法,由美国国家标准与技术研究院于 2001 年推出,用于替代DES算法。作为高级加密标准,AES提供三种密钥长度,分别是128 位、192 位和 256 位,密钥长度越高,破解系统或破解系统所需的时间就越多。

常见的AES算法有以下模式:

  1. ECB,电码本模式(Electronic Codebook Book Mode)
  2. CBC,密码分组链接模式(Cipher Block Chaining Mode)
  3. XTS,基于XEX的密文窃取算法的可调整密码本模式((XEX-TCB-CTS Mode)
  4. CFB,密码反馈模式(Cipher FeedBack Mode)
  5. OFB,输出反馈模式(Output FeedBack Mode)
  6. CTR,计算器模式(Counter Mode)
  7. CMAC,基于密码的消息验证码模式(Cipher-based Message Authentication Code Mode)
  8. GMAC,伽罗瓦消息验证码模式(Galois Message Authentication Code Mode)
  9. CCM,结合CTR模式和CMAC的分组加密模式(Counter with CBC-MAC Mode)
  10. GCM,结合CTR模式和GMAC的分组加密模式(Counter with Galois-MAC Mode)

AES-ECB模式

ECB,Electronic Codebook,电子密码本模式是最简单的块密码加密模式,加密前根据加密块大小(长度可以定为128,256或512bits)将明文分成若干块,之后将每块使用相同的密钥单独加密,解密同理。

ECB 模式中,相同的明文使用密钥一样的话,输出的密文也一样,这样有严重的漏洞,容易被攻击。当明文最后一个明文分组的内容小于分组长度时,需要使用一些特定的数据进行填充(见后文概念内容)。

ECB优势

  • 实现简单;
  • 计算快速;
  • 可并行计算

ECB劣势

  • 安全性低(明文中重复排列会反映在密文中);
  • 不能抵御重放攻击(见后续概念介绍)
  • 对包含某些比特错误的密文进行解密时,对应的分组会出错;
  • 通过删除、替换密文分组可以对明文进行操作

此处插入一个概念

重放攻击(Replay Attacks)

重放攻击又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通信过程中都可能发生,是计算机世界黑客常用的攻击方式之一。


AES-CBC模式

CBC模式,Cipher Block Chaining Mode,对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密,所有的密文分组像是链条一样互相连接在一起。

由于第一个明文分组前没有密文分组,所以在进行第一个明文块加密时,需要准备一个叫初始化向量的数据块代替需要进行异或操作的密文分组。CBC模式引入了IV(Initial Vector)和组间异或的概念,通过异或操作将加密快链接在一起。一般来说,每次加密都会随机产生一个不同的比特序列来作为IV(初始划向量)。与ECB模式类似,当明文最后一个明文分组的内容小于分组长度时,需要使用一些特定的数据进行填充。

CBC模式相比于EBC模式,确保了即使明文块相同,每个密文块也都是唯一的,增加了安全性,但带来的问题是没有办法随机访问各个区块了,访问某个区块必须解出前一个区块数据。

CBC模式的解密过程中,如果密文分组中有一个分组损坏,这种情况当密文长度没有发生变化,则解密时最多只有两个文组收到数据损坏的影响,但是当某个密文分组一些比特缺失时(长度发生变化),则此后所有的密文都无法解密。

CBC优势:

  • 相比于ECB更安全(明文的重复排列不会反应在密文中);
  • 支持并行计算(仅解密,可以先同时解密,再用链式异或获得明文);
  • 可解密任意密文分组;

CBC劣势:

  • 加密不支持并行计算;
  • 解密有关联性,对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错,不影响后续的解密过程

此处插入一个概念

ECB/CBC数据填充

ECB和CBC模式需要在最后一组数据不满足128bit时,需要进行数据填充,常用的是PKCS7填充方案。


AES-XTS模式

XTS,XEX-TCB-CTS,基于XEX的密文窃取算法的可调整密码本模式是一种用于加密大于128位数据的区块加密模式。它是AES的一种变体,旨在提供更高的安全性。XTS模式比‌ECB和CBC模式更安全,因为它解决了相同数据块加密后产生相同密文的问题,并且实现了不同数据块的独立加密和解密。

从XTS模式的名字中可以看到XEX,TCB和CTS三个专业名词,为了更好的理解XTS模式,现需要对这个专业名词进行了解。


此处插入三个概念

XEX

XEX,XOR-ENCRYPT-XOR,一种有限域算法,感兴趣的话可以深入了解下。

TCB

TCB,Tweakable Code Book,可调整密码本,通过引入Tweak值,使得分组加密中每组的加密秘钥都有所不同,避免相同数据通过同一密钥加密都得到相同的密文。

CTS

CTS,Cipher Text Stealing,密文窃取是一种常见的分组密码。在分组密码中,当明文长度不能被分组长度整除时,最后一个分组就需要填充。CTS模式是使用最后一个分组的前一个密文分组数据来进行填充的,见下图

使用CTS模式时,最后两个密文分组需要调换一下位置,因为原先处于N-1的密文需要取一部分给到原先最后一组明文N,进行加密后的数据长度仍为分组长度,为了保持明文密文长度一致,由于原先N-1位置的密文被截取了一部分,所以将最后两组的密文数据进行了交换。为了正确的解密,在进行CTS解密时,需要按照下图流程进行解密,保证解密明文的正确性。


XTS模式通过引入‌Tweak值与AES key配合使用来解决ECB和CBC模式存在的问题。在每个数据块的加密解密过程中,虽然使用同样的AES Key,但Tweak值却不同,Tweak通常与数据块的索引相关联(TXS模式一般应用在磁盘加密中,Tweak值可以跟数据块索引相关),这样一来,各个数据块的加密解密过程就相互独立了,确保了相同的数据块加密后产生不同的密文,并且实现了不同数据块的独立加密和解密。

XTS模式的计算流程如下:

  1. 输入信息包含明文、两个秘钥(K1,K2),Tweak信息;
  2. 使用Key2与Tweak进行加密,在与有限域乘法得到过程因子T;
  3. T先于原文异或,再通过key1对异或结果进行加密,最后再与T异或得到当前分组的密文
  4. 同一个数据块共享相同的Tweak,每个分组有限域乘法进行迭代,保证T发生变化

XTS在最后一个分组数据不满足128bit分组值时,则需要使用CTS模式(见上文描述)进行填充。

XTS模式主要用于磁盘加密,对于磁盘数据都是按扇区存储的(以一个512K的扇区为例,一次加密16Byte,则需要加密32次),不希望有额外的空间存储前面那些模式需要的IV向量,而且任意块都应该是可以随时加解密的,块(扇区)之间不应该有相关性。

XTS优势:

  • 各加密组间没有链接关系,支持并行计算

XTS劣势:

  • 当密文包含错误比特时,解密后该明文分组的全部比特以及后一个分组的相应比特会出错

AES-CFB模式

CFB模式,Cipher FeedBack Mode,密文反馈模式,所谓反馈是指前一个密文分组会被送到密码算法的输入端。

ECB和CBC模式中,明文分组都是通过密码算法进行加密的,但是在CFB模式中,明文分组没有通过密码算法直接进行加密,明文分组和密文分组之间进行了异或(XOR)操作。

CFB模式的解密需要注意的是解密分组密码算法依然是执行加密操作,因为秘钥流是通过加密实现的。

与CBC模式类似,CFB模式在生成第一组密文分组时,由于不存在前一个输出数据,所以需要使用初始化向量(IV),一般来说,需要在每次加密时生成一个不同的随机比特序列用作初始化向量。

与CBC模式相比,CFB引入了一个秘钥流(Key Stream)的概念,CFB模式中由密码算法生成的比特序列成为秘钥流。CFB模式中,密码算法相当于用来生成秘钥流的伪随机数生成器,初始化向量可以看做伪随机数生成器的种子。

CFB模式中,密码算法的输出相当于一次性密码本(见后续概念介绍)中的随机比特序列,但是CFB中的密码算法输出(Key Stream)是计算得出的,不可以看做真正的随机数,所以CFB模式也是可以被破译的。CFB模式明文数据是逐比特加密的,所以CFB模式是一种使用分组密码(见后续概念介绍)来实现流密码的方式

CFB优势:

  • 不需要填充;
  • 支持并行计算(仅解密);
  • 能够解密任意密文分组;

CFB劣势:

  • 加密不支持并行计算;
  • 当密文包含错误比特时,解密后该明文分组的全部比特以及后一个分组的相应比特会出错;
  • 不能抵御重放攻击;

此处插入三个概念,有助于对算法的了解:

一次性密码本

一次性密码本是一种非常简单的密码,他的原理是将明文与一串随机的比特序列进行XOR运算。使用一次性密码本,需要生成大量的随机数,且必须是无重现性的真正的随机数。

一次性密码本具备不可破译的特性,即使具有算力无穷强大的计算机,遍历所有的秘钥可能性对密文进行解密,得到的明文就有无穷种可能,且无法判断得到的明文是否正确(因为可能解出多种有明确意义的明文排列组合),所以认为一次性密码本是无条件安全的,在理论上无法破译

一次性密码本的缺点是

  • 加密秘钥的长度和密文相同(增加存储空间),且密文和秘钥必须相互对应(一旦发生比特错位,后续信息再无法正确破译)。
  • 数据同步过程中,密文和秘钥需要一起传递,在传递过程中既要保证密文的安全性,也要保证秘钥的安全性,增加了传递的难度。
  • 实现真正一次性密码本就需要有计算机生成无重现性的真正随机数,这个也是有难度的。

分组密码

分组密码(Block Cipher)每次只能处理特定长度的一块数据的一类密码算法,AES就是典型的分组密码。

流密码

流密码(Stream Cipher)是对数据流进行连续处理的一类密码算法。一次性密码本算法就是典型的流密码。


AES-OFB模式

OFB,Output-FeedBack,输出反馈模式,密码算法的输出会反馈到密码算法的输入中。与CFB模式类似,OFB模式不是将密码算法直接对明文进行加密,是将明文分组与密码算法的输出进行异或(XOR)操作来产生密文分组。

OFB模式也需要引入初始化向量(IV),一般来说,需要在每次加密时生成一个不同的随机比特序列来当做初始化向量

与CFB模式相比,CFB密码算法的输入是前一个密文分组(将密文分组反馈到密码算法中,Chiper-FeedBack),OFB中,密码算法的输入是前一个密码算法的输出(Output-FeedBack)。

CFB模式中密文分组需要反馈,所以必须从第一个明文分组开始按书序进行加密,无法跳过某个分组进行后续加密。OFB模式中,明文和加密算法的输入的秘钥流进行异或,OFB的秘钥流是可以可以通过密码算法提前生成的,与明文无关,所以可以对各组明文块进行并行加密。

OFB优势:

  • 不需要填充;
  • 加解密使用相同结构;
  • 可事先进行加密解密的准备;
  • 对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错;

OFB劣势:

  • 不支持并行计算;
  • 主动攻击者反转密文分组中某些比特时,明文分组中对应的比特也会被反转

AES-CTR模式

CTR,Counter,计数器模式是一种使用逐次累加的计数器来进行加密生成秘钥流的方法。

从上图可以看出,CTR模式中,每个分组对应一个逐次累加的计数器,对计数器进行加密操作来生成秘钥流,最终的密文分组是明文分组与加密算法的输出进行异或(XOR)操作得到的。

CTR模式在每次加密时都会生成一个不同的值(nonce)作为计数器的初始值,用来保证计数器每次的值不同,如下图所示:

计数器逐次累加的效果(前八个字节为nonce,后八个字节主次累加)如下图:

CTR模式中每个分组中对计数器的输出进行加密,所以每组加密的秘钥流也是不同的,这种方法用分组密码来模拟生成随机比特序列。

CTR模式和OFB模式一样,都属于流密码,区别是CTR模式是将计数器累加值的输出作为加密算法的输入(OFB是将加密算法的输出作为下一个加密的输入),因此也可以实现任意分组处理,实现并行计算。

CTR优势:

  • 不需要填充;
  • 加解密使用相同结构;
  • 支持并行计算;
  • 对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错;

CTR劣势:

  • 主动攻击者反转密文分组中某些比特时,明文分组中对应的比特也会被反转


以上章节描述了AES实现加密的常见算法模式,后面描述的则是基于AES算法实现消息认证的一些算法模式。

对之前的算法做一个总结:

AES-ECB AES-CBC模式 AES-XTS模式需要进行数据填充

AES-ECB AES-CBC模式 AES-XTS模式需要加密秘钥和解密秘钥,解密密钥靠加密秘钥生成

AES-CFB AES-OFB模式 AES-CTR模式不需要进行填充

AES-CFB AES-OFB模式 AES-CTR模式由于解密执行的也是加密算法,所以只需要加密密钥


AES认证加密

认证加密(Authenticated Encrption with Associated Data,AEAD) 

常见的对称加密算法,在解密过程中无法确认秘钥是否正确,这样密文可以用任何密钥执行解密运算,得到一组无法确认明文正确性,因此为了保证信息的正确性,需要在堆成加密加密算法上增加一层验证机制,这就是AEAD。

认证加密是一种将对称密码和消息认证码(见后续概念介绍)相结合,同时满足机密性、完整性和认证三大功能机制。


此处插入一个概念

消息认证码

消息认证码,Message Authentication Code,是一种确认完整性并进行认证的计数,取三个单词的首字母,简称为MAC。

消息认证码的输入包括任意长度的消息和一个发送者与接收者者之间一个共享的秘钥,可以输出固定长度的数据,这个数据简称为MAC值。


有一种认证加密方式叫做Encrypt-then-MAC,这种方式先用对称密码将密文加密,然后计算密文的MAC值。在Encrypt-then-MAC方式中,消息认证码的输入消息是密文,通过MAC值就可以判断密文是否可信。

除了Encrypt-then-MAC之外,还有一些其他的认证加密方式,如Encrypt-and-MAC(将明文用对称加密,并对明文计算MAC值)和MAC-then-Encrypt(先计算明文的MAC值,然后将明文和MAC值同时用对称密码加密)。

AES-CMAC模式

CMAC,Ciper-based MAC,是一种基于AES来实现的消息认证码。CMAC基于AES算法和一个密钥来生成消息认证码MAC,CMAC机制相比于传统校验和或错误检测码方法,提供了更强健的数据完整性保护,还能防止未经允许的数据修改或破坏,即使秘钥被破解,攻击者也无法反推出原始明文数据。

AES-CMAC的核心是CBC-MAC,使用了CBC模式的AES算法对明文进行处理,流程图如下所示:

可以看出CMAC的计算流程和CBC模式相近,明文按照128bit的大小分为多个block组进行计算,明文分组和前一个加密算法的输出进行异或(XOR)操作,区别别是最后一组明文分组的处理,当明文按照128bit分组后,最后一组的大小刚好为128bit,则在进行最后一组计算时,最后一组明文分组需要先和K1进行异或计算,再跟上一组的加密输入进行异或操作,经过最终的加密算法,得到最终的MAC值。

当明文的最后一个分组不能刚好时128bit时,CMAC也需要进行填充,将最后一个分组按照10^i(见后续概念描述)补齐为128bit。与常规的处理不同,最后一组补齐的明文分组需要跟K2进行异或后再再与前一组加密结果进行异或,经过最终的加密算法,得到最终的MAC值。

前文中提到的K1,K2是由AES KEY派生的得出的,根据CMAC算法,K1 K2的派生算法如下图所示:


此处插入一个概念

10^i填充

10^3就是常规计算得到1000,10^i就是1后面跟i个0,使用10^i填充,就是在不满足128bit位宽时,再低位补充1000……0,直到满足128位宽为止。


AES-GMAC模式

GMAC,Galois MAC,伽罗瓦消息验证码,利用伽罗瓦域(有限域)乘法运算来计算MAC值。GMAC是针对128bit的分组密码进行设计的,GMAC将密文分组处理后,使用伽罗瓦域乘法运算得到MAC值,具体流程见下图。

上图中Galois计算是指将输入域密钥在伽罗瓦域GF(2^128上做计算)

AES-CCM模式

CCM,Counter with CBC MAC,是一种基于对称加密算法的认证加密模式,结合了CBC-MAC(Cipher Block Chaining Message Authentication Code)用于消息认证和CTR(Counter)模式用于加密。这种模式可以确保信息的机密性和完整性。

CCM首先使用CMAC模式对明文进行认证,然后使用CTR模式进行数据的加密。CCM的输入包含四个元素:

  • 待认证和加密的数据(P)
  • 将被认证但不被加密的相关数据(ADD)
  • Nonce
  • 密钥Key

CCM加密总体流程如下:

具体流程如下:

  1. CCM中需要将数据进行分组,但并不是直接将明文分组,而是如图将{Nonce,ADD,P}组合后再进行拆分成B0,B1……Br,在CMAC中使用,其中B0组成比较特殊,将在后续进行描述
  2. 将明文数据按照128bit进行拆分,在后续的CTR加密算法中使用
  3. 使用CMAC方式计算分到MAC值T
  4. 使用CTR算法对明文进行加密得到密文{C1,C2……Cm},对T进行加密得到C0,CTRi的生成见后续描述
  5. 将C0作为最终的Tag值拼接在密文最后,得到最终的密文C

B0的组成如下图所示:

B0 16个字节分为以下三个部分

  • 第一部分内容为Flag,大小为一个字节, 组成见上图(Adata表示ADD是否为空,t表示MAC长度{4,6,8,10,12,14,16},q表示Q的字节长度)
  • 第二部分内容为N(Nonce),Nonce可选的大小为{7,8,9,10,11,12,13}
  • 第三部分内容为Q(明文P的长度),二进制形式体现

CTR模式中CTRi的生成方式如下:

CTRi 16字节分为以下三个部分

  • 第一部分内容为Flag,大小为一个字节,组成见上图(q表示[i]的字节长度)
  • 第二部分为N(Nonce),Nonce可选的大小为{7,8,9,10,11,12,13}
  • 第三部分为累加值[i]

CCM解密总体流程如下:

具体流程如下:

  1. 判断如果密文长度小于Tag长度,直接返回无效,不进行解密
  2. 将密文取出(排除Tag),划分为m个数据块,使用CTR进行解密,得到明文,取出Tag使用CTR进行解密得到MAC值T
  3. 再根据CMAC计算出的MAC值T*,比较T和T*,一致则表示校验成功,返回明文,不一致则表明校验失败,不返回明文

AES-GCM模式

GCM,Galois/Counter Mode,其中 G 是指GMAC,C 是指 CTR 模式,可以将 GCM 认为是认证模式的一种,提供认证加密(Authenticated Enycrption)和认证解密(Authenticated Decryption)两种功能。

GCM认证加密

GCM认证加密所需数据如下:

  • 明文,P,可以不是128bit的整数倍
  • 秘钥,KEY,128bit
  • 初始向量,IV,一般大小为96bit,用于初始计数器块,计数器为32bit整数,一共128bit
  • 附加认真数据,ADD,此数据仅用作认证,不用做加密,可以不是128bit的整数倍
  • 末尾块,L,4个字,第1,3个字为0,第二个字为ADD数据长度,第四个字为明文数据长度

GCM认证加密数据准备阶段

ADD数据和明文数据都需要按照128bit大小进行分组。

GCM认证加密标头(Hearder)处理阶段

将ADD数据按照分组进行伽罗瓦域乘法运算得到认证中间数据T1,ADD最后一组数据满足128bit时,需要进行填充,一般使用0进行填充。在实际GCM模式中,可以不包含ADD数据,需要在末尾块中表明ADD的数据为0即可。

GCM认证加密数据处理阶段

使用CTR模式对明文进行加密,CTR的初值由IV值和计数器初值组合而成,如流程图所示按照分组对明文进行分组加密,若最后一组明文数据不是128bit时,需要填充数据0,读出数据解密数据时,抛弃填充的数据位得到加密数据C。

在进行数据加密的同时,也需要跟标头处理阶段T1分组进行伽罗瓦域乘法运算得到认证中间数据T2。

GCM认证加密末尾处理阶段

将末尾块数据L和数据阶段处理后的认证中间数据T2进行伽罗瓦域乘法运算得到认证中间数据T3,在于进行CTR加密第一组加密后的数据进行异或运算得到最后的MAC值T。

GCM认证解密

GCM认证解密阶段所需数据如下:

  • 密文,C
  • 认证MAC,T
  • 初始向量,IV,一般大小为96bit,用于初始计数器块,计数器为32bit整数,一共128bit
  • 附加认真数据,ADD,此数据仅用作认证,不用做加密,可以不是128bit的整数倍
  • 末尾块,L,4个字,第1,3个字为0,第二个字为ADD数据长度,第四个字为密文数据长度

在GCM认证解密阶段,如加密认证过程中的MAC值计算流程一致,得出认证MAC值T`,和输入待认证的MAC值T进行对比,一致则输出根据CTR模式解密得到明文P,若不一致则输出错误Flag且不进行解密。


找了N多资料,终于整理齐全了,感谢大家的关注和收藏,有问题大家一起讨论!!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值