VPN:AES加密算法原理
AES(Advanced Encryption Standard,高级加密标准)是美国国家标准与技术研究院(NIST)在2001年建立了电子数据的加密规范。它是一种分组加密标准,每个加密数据块大小固定为128位(16个字节),最终生成的加密密钥长度有128位、192位和256位这三种。
另外,AES主要有五种工作模式(其实还有很多模式):ECB(Electronic codebook,电子密码本)、CBC(Cipher-block chaining,密码分组链接)、CFB(Cipher feedback,密文反馈)、OFB(Output feedback,输出反馈)、PCBC(Propagating cipher-block chaining,增强型密码分组链接)。
1. AES的数据块填充
AES的加密数据块大小为128位(16个字节),这涉及到一个填充的问题,因为一个数据很可能不是16个字节的整数倍。在AES加密算法中又涉及到No Padding(不填充)、PKCS5Padding、ISO10126Padding、Padding Mode.Zeros和Padding Mode.PKCS7这几种填充模式。
如果加密数据块的长度正好是16字节,则需要再补一个16字节,各种支持填充的方式都是这样的(即No Padding填充方式除外)。
(1)No Padding
这种模式就是不填充,即不足128位的加密数据块加密后仍是原来的长度,原来是多少位,加密后的密钥仍是多少位,这与AES的密钥长度规定其实不符的,所以通常很少采用。这种填充方式也并不是所有AES工作模式都支持的,只有CFB、OFB模式支持,CBC、ECB和PCBC模式不支持。
(2)PKCS5Padding
PKCS5Padding填充方式的填充原则是:如果原始加密数据块长度少于16个字节(128位),则需要补满16个字节,填充的方式是缺多少个字节,就在后面补多少个所缺字节的值。
如原始加密数据块为winda_gz01,这里有10个字符,对应10个字节(每个字符用8位,即一个字节表示),这样离16个字节的要求还差6个字节,这时就要在最后补6个“6”(这个“6”也要用8位二进制表示,即00000110)。
如果原始加密数据块恰好是16个字节的整数倍,则还要增加一个16字节的“16”,即16个“00010000”。
(3)Padding Mode.PKCS7
在PKCS5Padding填充方式中,所填充的块是按一个字节(即8位)来计算的,而在Padding Mode.PKCS7填充方式中,对于填充的块的大小是不确定的,可以在1~255之间,但填充值的算法与PKCS5Padding填充方式一样。
如果填充块长度为8比特,原始加密数据块长度为9个字节,则需要填充7个八位的“7”(也即相当于7个字节),使得加密数据块仍为16个字节(128位)。所以当选择的填充块为8位时,Padding Mode.PKCS7填充方式与前面的PKCS5Padding填充方式是一样的,只不过在Padding Mode.PKCS7填充方式中的填充块大小可以不是8位,而是可在1~255之间根据需要选择。
填充块长度的选择是与原始加密数据块大小有关的,必须要使得填充块大小的n倍(n为整数),加上原始加密数据块长度最终能为16个字节。如原始加密数据块长度仍为9个字节,此时就不能选择16位的填充块长度了,否则填充块就只有3.5倍了,显然不行。
(4)ISO10126Padding
这种填充方式的填充原则是:填充块通常也是8位(一个字节),但最后一直填充块用来标识整填充字节序列的长度,其余填充块可填充随机数据。
如原始加密数据块长度为9个字节,要填充到16个字节,则需要填充7个字节,而在这7个填充字节(填充块)中前6个字节可是随机数值,但最后一个字节的值为二进制中的“7”(用来标识整个填充字节长度为7,对应的二进制为“00000111”)。
如果原始加密数据块恰好是16个字节的整数倍,则还要增加一个16字节,其中前面15个字节可以是随机数值,但最后一个字节用来标识新填充的16个字节的值“16”,即最后一个填充字节为“00010000”。
(5)Padding Mode.Zeros
这种填充方式最简单,就是不够部分用“0”来填充。如原始加密数据块长度为9个字节,要填充到16个字节,则需要填充7个字节的“0”。
如果原始加密数据块恰好是16个字节的整数倍,则还要增加一个16字节的“0”,每个字节都是8个“0”(即00000000)来填充。
表1列出了三种最常用的AES工作模式对三种最常用的填充方式的支持。
表1 AES工作模式对填充方式的支持
从表中可以看出,在原始数据长度为16个字节的整数倍时,假如原始数据长度等于16×n,则使用No Padding时加密后数据长度等于16×n,其他情况下加密数据长度等于16×(n+1),即要新增一个16字节。在不足16的整数倍的情况下,假如原始数据长度等于16×n+m(其中m小于16),除了No Padding填充之外的任何方式,加密数据长度都等于16×(n+1),不够16字节部要要根据对应填充方式填充到16字节。No Padding填充对于CBC、ECB和PCBC三种模式是不支持的,而CFB、OFB两种模式下则加密后的数据长度等于原始数据长度。
2. AES四种工作模式加/解密原理
下面介绍ECB、CBC、CFB和OFB四种AES工作模式下对数据进行加密和解密的基本原理。
(1)ECB模式加/解密原理
ECB(电子密码本)模式是最简单的块密码加密模式,加密前根据数据块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独通过块加密器加密,解密的过程与加密的过程相逆,所使用的是块解密器。
ECB模式的基本加密原理图如图1所示,基本解密原理如图2所示。
图1 ECB模式数据加密原理示意
图2 ECB模式数据解密原理示意
这种加密模式的优点就是简单,不需要初始化向量(IV),每个数据块独立进行加/解密,利于并行计算,加/解密效率很高。但这种模式中,所有数据都采用相同密钥进行加/解密,也没有经过任何逻辑运算,相同明文得到相同的密文,所以可能导致“选择明文攻击”的发生。也就是攻击者可以事先任意选择一定数量的明文(通常不是一条,主要是为了最大限度地从中破解这些明文被加密的规律),让被攻击的加密算法为这些明文加密(当然这个明文发送者已具有一定权限,可以让加密器为他发的数据进行加密),从而得到相应的密文。然后攻击者通过对多组明文和密文的分析获得关于加密算法的一些信息(如果不同明文中的相同片段,得到的某密文片段也一样,就可以知道这些密文是代表什么意思了),以利于攻击者在将来更有效的破解由同样加密算法(以及相关钥匙)加密的信息。
在这里引用网上传的一则例子来说明。那就是在1942年,第二次世界大战过程中美国海军情报局截获了日本一条军事情报,情报显示“AF”(密文中的某个片段,并未解读出)将会是下一个攻击目标,密码专家认为AF对应的是“Midway”(中途岛),但是美国当局认为日本不可能攻打中途岛。为了证实这一点,密码专家想出了一个方法,要求中途岛海军基地的司令官以无线电向珍珠港求救,说“中途岛上面临缺水的危机”。不久后,美国海军情报局便截夺到一则来自日本的信息,内容果然提到了“AF”出现缺水问题。结果“AF”便被证实为“中途岛”的意思,也就是日本海军的下一个攻击目标。这可以说是“明文攻击”的一个侧面说明,是攻击者主动发起的。
(2)CBC模式加/解密原理
CBC(密码分组链接)模式是先将明文切分成若干小块,然后每个小块与初始块或者上一段的密文段进行逻辑异或(⊕,XOR)运算后,再用密钥进行加密。第一个明文块与一个叫初始化向量(Initialization Vector)的数据块进行逻辑异或运算。这样就有效的解决了ECB模式所暴露出来的问题,即使两个明文块相同,加密后得到的密文块也不相同。
CBC模式的基本加密原理如图3所示(以两个数据块为例进行介绍)。CBC的解密解密过程也可以看成是CBC加密过程逆过程,如图4所示。
图3 CBC模式数据加密原理示意图
图4 CBC模式数据解密原理示意
从图中可以看出,在CBC模式中引入了一个随机的初始化向量(这是一个参数,需要事先设置),并且还采用了异或逻辑运算,不是直接把明文用密钥加密,而且前后数据块的加/解密是关联的,所以相同明文不一定能得到相同的密文,加密的破解难度更大,不易被主动攻击,安全性好于ECB,是SSL、IPSec通常采用的加/解密模式。
CBC模式的缺点也是它的优点附带的,那就是加密过程复杂,效率较低。其次,由于采用串行运算方式,所以只要其中一个数据块的加/解密运算或数据传输错误都可能导致整个数据的加/解密失败。另外,与ECB模式一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。
(3)CFB模式加/解密原理
与ECB和CBC模式只能够加密块数据不同,CFB(密文反馈)模式能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。CFB模式的基本加密原理如图5所示,基本解密原理如图6所示。CFB的加密过程分为两部分:
图5 CFB模式的基本加密原理示意
图6 CFB模式的基本解密原理示意
CFB以及OFB模式中解密过程也都是用的加密器,而非解密器。
将前一数据块加密得到的密文通过块加密器利用密钥再进行加密;
将上一步加密得到的数据再与当前块的明文进行逻辑异或运算。
实际的加/解密原理比较复杂,作为网络管理、维护人员可不深入了解。
这种加密模式中,由于加密流程和解密流程中被块加密器加密的数据是前一块的密文,因此即使本块明文数据的长度不是数据块大小的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。
(4)OFB模式加/解密原理
OFB(输出反馈)模式不再是直接加密明文块,其加密过程是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流进行逻辑异或运算得到密文流,如图7所示。解密过程是先用块加密器生成密钥流,再将密钥流与密文流进行逻辑异或运算得到明文,如图8所示。
图7 OFB模式的基本加密原理示意
图8 OFB模式的基本解密原理示意
