参考文章:
1.高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)
https://blog.csdn.net/charleslei/article/details/48710293
2.分组对称加密模式:ECB/CBC/CFB/OFB
https://blog.csdn.net/aaaaatiger/article/details/2525561
3.aes加密解密,含 128、192、256位,cbc、cfb、ecb、ofb、pcbc模式
https://blog.csdn.net/e_Inch_Photo/article/details/80455399
4.AES模式和填充
https://www.jianshu.com/p/1ec9f8819db9
5.java加密算法之AES小记
https://blog.csdn.net/u013749540/article/details/70228033
最近对接某媒体,其部分内容使用了 AES 对称加密算法,我对该算法做了一些大致的研究,
整理如下:
1.什么是AES加密算法
2.AES常见的几种加密模式与填充模式
3.AES算法的几种加密模式介绍
4.AES算法的几种加密模式优缺点
5.AES算法的填充模式介绍
6.AES算法的Java实现
2.AES常见的几种加密模式与填充模式
AES支持五种模式:CBC,CFB,ECB,OFB,PCBC
jce中实现了三种补码方式:NoPadding,PKCS5Padding,ISO10126Padding;
不支持SSL3Padding,不支持“NONE”模式。
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。
CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。
ECB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。
下面对模式与填充方式的组合做一个总结:
算法/模式/填充 字节加密后数据长度 不满16字节加密后长度
AES/CBC/NoPadding 16 不支持
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始数据长度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始数据长度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
AES算法的几种加密模式介绍
ECB模式(电子密码本模式:Electronic codebook)
ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,
之后将每块使用相同的密钥单独加密,解密同理。
加密流程:
解密流程:
ECB模式由于每块数据的加密是独立的因此加密和解密都可以并行计算,
ECB模式最大的缺点是相同的明文块会被加密成相同的密文块,这种方法在某些环境下不能提供严格的数据保密性。
CBC模式(密码分组链接:Cipher-block chaining)
CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。
第一个明文块与一个叫初始化向量
的数据块异或。
对于这个初始化向量,我们一般称呼其为IV
加密流程:
解密流程:
CBC模式相比ECB有更高的保密性,但由于对每个数据块的加密依赖与前一个数据块的加密,
所以加密无法并行。
与ECB一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。
CFB模式(密文反馈:Cipher feedback)
与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。
加密流程:
解密流程:
注意:CFB、OFB和CTR模式中解密也都是用的加密器而非解密器。
CFB的加密工作分为两部分:- 将一前段加密得到的密文再加密;
- 将第1步加密得到的数据与当前段的明文异或。
由于加密流程和解密流程中被块加密器加密的数据是前一段密文,因此即使明文数据的长度不是加密块大小的整数倍
也是不需要填充的,这保证了数据长度在加密前后是相同的。
128位的CFB是对前一段数据的密文用块加密器加密后保存在IV中,之后用这128位数据与后面到来的128位数据异或,
CFB 的其他扩展
CFB128是每处理128位数据调用一次加密器,
此外还有两种常用的CFB是CFB8和CFB1,前者每处理8位调用一次加密器,后者每处理1位调用1次加密器,
就运算量来讲CFB1是CFB8的8倍,是CFB128的128倍。对于CFB8和CFB1需要将IV作为移位寄存器。
CFB8的加密流程
- 使用加密器加密IV的数据;
- 将明文的最高8位与IV的最高8位异或得到8位密文;
- 将IV数据左移8位,最低8位用刚刚计算得到的8位密文补上。
重复1到3。
CFB1的加密流程
- 使用加密器加密IV的数据;
- 将明文的最高1位与IV的最高1位异或得到1位密文;
- 将IV数据左移1位,最低1位用刚刚计算得到的1位密文补上。
重复1到3。
OFB模式(输出反馈:Output feedback)
OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,
解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性,
所以加密和解密的流程是完全一样的。
加密流程:
解密流程:
4.AES算法的几种加密模式优缺点
ECB模式
优点:
1.简单;
2.有利于并行计算;
3.误差不会被传送;
缺点:
1.不能隐藏明文的模式;
2.可能对明文进行主动攻击;
================================
CBC模式
优点:
1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
1.不利于并行计算;
2.误差传递;
3.需要初始化向量IV
===============================
CFB模式
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.误差传送:一个明文单元损坏影响多个单元;
3.唯一的IV;
===================================
OFB模式
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.对明文的主动攻击是可能的;
3.误差传送:一个明文单元损坏影响多个单元;5.AES算法的填充模式介绍
这块我单独整理了一个模块,请直接参考我另一篇文章。
密码学_填充算法-Java支持的几种填充算法与其实现原理
https://blog.csdn.net/u010003835/article/details/81035308
6.AES算法的Java实现
这部分我单独写了一篇文章,有需要的请参考我的另一篇文章。