什么是AES对称加密算法

作者: java 发布时间: 2021-03-16 浏览: 1320 次 编辑

小明:老师,请问了解AES算法吗?

老师:了解一些,AES算法是典型的【对称加密算法】

小明:我不太明白,这个对称加密是什么鬼?它跟MD5,SHA这样的哈希摘要算法有什么不同?

老师:对称加密不同于信息摘要,是真正意义上的加密算法。我们来看看下面这个例子:

假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方接收的是一个明文消息“我是小明”

如果消息被中间人截获到,即使中间人无法篡改信息,也可以窥探到信息内容,从而暴露了通信双方的私密。

因此我们不再直接传送明文,而改用对称加密的方式传输密文,画风就变成了下面这样:

具体工作的步骤如下:

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

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

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

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

小明:原来如此,可以详细地介绍一下AES算法吗?它有什么样的特点呢?

老师:AES算法全称Advanced Encryption Standard,是DES算法的替代者,也是当今最流行的对称加密算法之一。要想学习AES算法,首先要弄清楚三个基本的概念:密钥、填充、模式。

1.密钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

AES支持三种长度的密钥:

128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

小明:那么,AES128,AES192,AES256在使用效果上有什么不同呢?

老师:从安全性来看,AES256安全性最高。从性能来看,AES128性能最高。本质原因是它们的加密处理轮数不同。

2.填充

要想了解填充的概念,我们先要了解AES的分组加密特性。

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

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。

这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

但是这里涉及到一个问题:

假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

小明:填充?听起来和MD5处理明文的方式有点像呢。

老师:的确,两者的思想有共通支出。AES在不同的语言实现中有许多不同的填充算法,我们只举出集中典型的填充来介绍一下。

NoPadding:

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

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}

需要注意的是,如果在AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。

3.模式

AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:

ECB、CBC、CTR、CFB、OFB

模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。

ECB模式(默认):

电码本模式 Electronic Codebook Book

CBC模式:

密码分组链接模式 CipherBlock Chaining

CTR模式:

计算器模式 Counter

CFB模式:

密码反馈模式 CipherFeedBack

OFB模式:

输出反馈模式 OutputFeedBack

同样的,如果在AES加密的时候使用了某一种工作模式,解密的时候也必须采用同样的工作模式。

小明:想要使用不同长度的密钥,以及不同的填充和模式,在代码里如何体现呢?

老师:AES算法在Java的javax.crypto包里有很好的封装,我们来看一下调用的方法:

1. kgen.init传入的第一个参数128决定了密钥的长度是128bit。

2. Cipher.getInstance("AES/CBC/NoPadding")决定了AES选择的填充方式是NoPadding,工作模式是CBC模式。

几点补充:

1.我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。

2.填充明文时,如果明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会填充一组额外的16字节明文块。

以上就是AES的基本概念。