AES 算法
简介
-
AES 算法是典型的【对称加密算法】
-
不同于摘要算法,摘要算法是不可逆的,它的主要作用是对信息一致性和完整性的校验;而对称加密算法是可逆的,它的主要作用是保证私密信息不被泄露。
-
AES 算法全称 Advanced Encryption Standard,是DES算法的替代者,也是当今最流行的对称加密算法之一。
-
AES 算法包含三个基本的概念:密钥、填充、模式。
- 密钥
密钥是AES 算法实现加密和解密的基本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES 算法支持三种长度的密钥: 128位,192位,256位平时大家所说的 AES128,AES192,AES256,实际上就是指的 AES 算法对不同长度密钥的使用。
从安全性俩看,AES256安全性最高。从性能来看,AES128性能最高。本质原因是他们的加密处理轮数不同。
-
填充
AES 算法加密是分组加密。
AES 算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度 128bit。
这些明文块经过 AES 加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的 AES 加密结果。
但是这里涉及到一个问题:
假如一段明文长度是 192bit,如果按每 128bit 一个明文块来拆分的话,第二个明文块只有 64bit,不足 128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。
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} ZeroPadding: 数据长度不对齐时使用0填充,否则不填充。使用0填充有个缺点,当元数据尾部也存在0时,在unpadding时可能会存在问题。 PKCS7Padding 假设每个区块大小为blockSize <1> 已对齐,填充一个长度为blockSize且每个字节均为blockSize的数据。 <2> 未对齐,需要补充的字节个数为n,则填充一个长度为n且每个字节均为n的数据。 PKCS5Padding是PKCS7Padding的子集,只是块大小固定为8字节。所以两者的区别在于PKCS5Padding是限制块大小的PKCS7Padding。需要注意的是,如果AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。
-
模式
AES 的工作模式,体现在把明文块加密成密文块的处理过程中。AES 加密算法提供了五种不同的工作模式:
ECB、CBC、CTR、CFB、OFB
模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。
ECB 模式(默认): 电码本模式 Electronic Codebook Book
CBC 模式: 密码分组链接模式 Cipher Block Chaining
CTR 模式: 计算器模式 Counter
CFB 模式: 密码反馈模式 Cipher FeedBack
OFB 模式: 输出反馈模式 Output FeedBack
通样的,如果在AES加密的时候使用了某一种工作模式,解密的时候也必须采用通样的工作模式。
AES 算法在Java的javax.crypto包里有很好的封装。
Cipher.getInstance("AES/CBC/NoPadding") // 决定了 AES 选择的填充方式是 NoPadding,工作模式是 CBC 模式。
补充
-
我们在调用封装好的 AES 算法时,表面上使用的 Key 并不是真正用于 AES 加密解密的密钥,而是用于生成真正密钥的 “种子”。
-
填充明文时,如果明文长度原本就是 16 字节的整数倍,那么除了 NoPadding 以外,其他的填充方式都会填充一组额外的 16 字节明文块
- 密钥