AES算法是典型的对此加密算法
1、对称加密算法示例
传送过程中不使用明文,而改用对称加密的方式传输密文时,如下所示:
1、发送方使用秘钥对信息进行加密
2、接收方使用同样的秘钥对信息进行解密
2、AES算法
要学习AES算法,首先要清楚三个基本的概念,秘钥、填充、模式
1、**
**是AES算法实现加密和解密的根本,对称加密算法之所以对称,是因为这类算法对明文的加密和解密要使用同一个**。
AES支持三种长度的秘钥:128位、192位、256位。平时大家所说的AES128、AES192、AES256,实际上就是指的AES算法对不同长度**的使用。
而不同长度的**的差异在于:从安全性来看,AES256安全性最高,从性能来看,AES128性能最高。本质上原因是因为他们的加密处理轮数不同。
2、填充
要想了解填充的概念,要先了解AES的分组加密特性。什么是分组加密呢?看下面这张图:
AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是吧明文拆分成一个个独立的明文块,然后将这些明文块经过AES加密器的复杂处理,生成一个个独立的密文快,这些密文快拼接在一起,就是最终的AES加密结果。(每一个明文块的长度是128bit)
但是此时就会有一个问题,假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit,这个时候怎么办呢?就需要对明文块进行填充(padding)
常见的填充:
NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍
PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
ISO10126Padding:
如果明文块少于16个字符(128bit),在明文块末尾补足相应数量的字符,最后一个字符值等于缺少的字符数,其他字符填充随机数。
如果在加密的时候,使用了某种填充方式,那么自然在解密的时候,也需要使用这种填充方式来解密。
3、模式
AES的工作模式,体现在把明文块加密成密文块的处理过程中,AES加密算法提供了五种不同的工作模式:
ECB:默认,电码本模式
CBC:密码分组链接模式
CTR:计算器模式
CFB:密码反馈模式
OFB:输出反馈模式
同样的,如果在AES加密的时候使用了某一种工作模式,解密的时候也需要采用同样的工作模式。
3、秘钥、填充、模式具体的体现
以java中javax.crypto的AES加密算法为例:
1、kgen.init传入的第一个参数128决定了秘钥长度为128bit
2、Cipher.getInstance(“AES/CBC/NoPadding”)决定了AES选择的填充方式为NoPadding,工作模式是CBC模式。
4、AES算法的底层原理
1、把明文按照128bit拆分传若干明文快
2、按照选择的填充方式来填充最后一个明文块
3、每一个明文块利用AES加密器和**,加密成密文块
4、拼接所有的密文块,称为最终的密文结果。
那么AES加密器里面到底有什么呢?
AES加密不是一次把明文变成密文,而是先后经过多轮加密。
。。。真复杂