AES对称加密算法简记(一)

文章正文
发布时间:2024-10-14 17:52

AES对称加密算法简记(一)

AES简介

最近在看AES,做一个简单的记录。
AES算法是高级加密标准(AES,Advanced Encryption Standard)为最常见的典型的对称加密算法(微信小程序加密传输就是用这个加密算法的)。

与哈希摘要算法不同

它跟MD5,SHA这样的哈希摘要算法有什么不同?
对称加密不同于信息摘要,是真正意义上的加密算法。我们来看看下面这个例子:
假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方接收的是一个明文消息“我是小明”。

图示


如果消息被中间人截获到,即使中间人无法篡改信息,也可以窥探到信息内容,从而暴露了通信双方的私密。
因此我们不再直接传送明文,而改用对称加密的方式传输密文,画风就变成了下面这样:

图示


具体工作的步骤如下:

发送方利用密钥123456,加密明文“我是小明”,加密结果为TNYRvx+SNjZwEK+ZXFEcDw==。

发送方把加密后的内容TNYRvx+SNjZwEK+ZXFEcDw==传输给接收方。

接收方收到密文TNYRvx+SNjZwEK+ZXFEcDw==,利用密钥123456还原为明文“我是小明”。

摘要算法是不可逆的,它的主要作用是对信息一致性和完整性的校验。而对称加密算法是可逆的,它的主要作用是保证私密信息不被泄露
具体的加密流程如下图:

图示


下面简单介绍下各个部分的作用与意义:

明文P

没有经过加密的数据。

密钥K

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

AES加密函数

设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

密文C

经加密函数处理后的数据

AES解密函数

设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

对称加密算法与非对称加密算法

对称加密算法

对称加密算法也就是加密和解密用相同的密钥。这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

非对称加密算法

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

一个特性和三个基本的概念

AES算法是DES算法的替代者,也是当今最流行的对称加密算法之一。要想学习AES算法,首先要弄清楚三个基本的概念:密钥、填充、模式。
在了解这三个基本概念之前先要了解一个特性:AES的分组加密特性。

分组加密

什么是分组加密呢?我们来看看下面这张图:

分组加密


AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度相等。在AES标准规范中,分组长度只能是128位(128bit),也就是说,每个分组为16个字节(每个字节8位)。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,直到加密完所有的明文块,然后再将这些密文块拼接在一起,就是最终的AES加密结果。

图示


图示


这就是分组加密。

分组加密的安全性

任何分组密码模式都存在信息的泄露,没有一个是完美的,任何分组模式都可能会泄露信息,这只是一个概率的问题。

碰撞概率计算:
M个明文块,块长为N,以两个块组成一对,
不同块的对数为:M(M-1)/2
两个块相等的概率为:1/2的n次方
密文块相等的数量期望为:M(M-1)/2的n+1次方
则当M(M-1)=2的n+1次方时候,即M约等于2的n/2次方时发生碰撞的概率约等于1。
例如:分组长度为64,则当块数为2的32次方时,即加密数据2的32次方*64bit=256G时便会发生碰撞。

所以分组密码的安全不仅和秘钥长度有关还和分组长度有关。

密钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES支持三种长度的密钥:128位,192位,256位。
平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。
那么,AES128,AES192,AES256在使用效果上有什么不同呢?
从安全性来看,AES256安全性最高。从性能来看,AES128性能最高。本质原因是密钥的长度不同,加密处理轮数不同。
密钥长度与加密处理轮数,如下表所示:

AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-128   4   4   10  
AES-192   6   4   12  
AES-256   8   4   14  

轮数在下面介绍,这里实现的是AES-128,也就是密钥的长度为128位,加密轮数为10轮。

有一个值得注意的是:我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。

填充

假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。
AES在不同的语言实现中有许多不同的填充算法,我们只举出集中典型的填充来介绍一下。

PKCS5Padding(默认)
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}。

默认填充

ISO10126Padding
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

NoPadding
不做任何填充,但是要求明文必须是16字节的整数倍。

不做填充

需要注意的是,如果在AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。
填充简单的描述就是将明文填充到满足分组大小,解密后再把填充去掉。规则为:

缺几个字节填充几个自己的几(如缺5个字节,填充5个字节的5);如果不需要填充,即明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会添加一个额外的分组(16字节明文块),分组中填充分组大小(如分组大小为64,填充16个字节的16)。

模式

分组密码在加密时明文分组的长度是固定的,而实用中待加密消息的数据量是不定的,数据格式可能是多种多样的。为了能在各种应用场合安全地使用分组密码,通常对不同的使用目的运用不同的工作模式。
AES加密算法提供了五种不同的工作模式:ECB、CBC、CFB、OFB、CTR。
这些AES的工作模式,体现在把明文块加密成密文块的处理过程中。
同样的,如果在AES加密的时候使用了某一种工作模式,解密的时候也必须采用同样的工作模式。

电码本模式(ECB,Electronic Codebook Book)

将整个明文分成若干段相同的小段,然后对每一小段进行加密。
如同DES的ECB,就是将数据按照8个字节一段进行AES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

ECB

优:操作简单,易于实现;分组独立,易于并行;误差不会被传送。——简单,可并行,不传送误差。

缺:掩盖不了明文结构信息,难以抵抗统计分析攻击。——可对明文进行主动攻击。

分组重放攻击

密码分组链模式(CBC,CipherBlock Chaining)

先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

CBC

优:能掩盖明文结构信息,保证相同密文可得不同明文,所以不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺:不利于并行计算;误差传递,前一个出错则后续全错;需要初始化向量IV,第一个明文块需要与一个初始化向量IV进行抑或,初始化向量IV的选取比较复杂。

密码反馈模式(CFB,CipherFeedBack)

密文反馈模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。
与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。

CFB

优:隐藏了明文模式;分组密码转化为流模式;可以及时加密传送小于分组的数据。

缺:不利于并行计算;误差传送:一个明文单元损坏影响多个单元;唯一的IV。

输出反馈模式(OFB,OutputFeedBack)

密码算法的输出(指密码key而不是密文)会反馈到密码算法的输入中,OFB模式并不是通过密码算法对明文直接加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组。
就是将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。

OFB

优:隐藏了明文模式;结合了分组加密和流密码(分组密码转化为流模式);可以及时加密传送小于分组的数据。

缺:不利于并行计算;需要生成秘钥流;对明文的主动攻击是可能的;误差传送:一个明文单元损坏影响多个单元。

计数器模式(CTR,Counter)

完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行XOR操作 。

优:不泄露明文;仅需实现加密函数;无需填充;可并行计算。

缺:需要瞬时值IV,难以保证IV的唯一性。

对比CBC和CTR

CBC需要填充;CTR不用填充。

CBC不可并行;CTR可并行速度快。

CBC需要实现加密和解密函数;CTR实现简单,仅需实现加密函数。

鲁棒性:CBC强于CTR——使用重复瞬时值,CBC会泄露初始明文块,CTR会泄露所有信息。如果有好的瞬时值选择策略,采用CTR,否则采用CBC。如加密成绩单,可选用CTR,因为学号唯一。可作为瞬时值。

流密码

上面的几个模式中,有的都提到了流密码或流模式。
序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种,一次加密明文中的一个位(分组密码,也叫块加密(block cyphers),一次加密明文中的一个块)。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。

流密码

参考链接

https://www.cnblogs.com/liangxuehui/p/4651351.html

https://blog.csdn.net/qq_23993447/article/details/80539641

https://blog.csdn.net/includeiostream123/article/details/51066799

首页
评论
分享
Top