VPN | AES、DES 加密算法原理
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:460500587
微信公众号:计算机与网络安全
ID:Computer-network
介绍在一些三层VPN方案中所使用的一些加密算法原理。加密算法就是为生成对数据进行加密的密钥,通常是对称的,即加密和解密是采用相同的密钥。在VPN方案中,所支持的加密算法也比较多,主要包括:DES(包括des、des-cbc)、3DES(3des、3des-cbc)、AES(包括aes-128、aes-192、aes-256、aes-cbc-128、aes-cbc-192、aes-cbc-256)、SM1。
一、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模式的基本解密原理示意
二、DES加密算法原理
DES(Data Encryption Standard,数据加密标准)是1972年美国IBM公司研制的对称密码体制(加密和解密使用相同的密钥)加密算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
与AES算法相比,DES在参数特性方面主要区别体现在以下几个方面:
DES的数据块大小为8个字节,而AES的数据块大小为16个字节。
DES的密钥长度是64位(其中8位用于校验),而AES的密钥长度是128位(AES算法比DES算法更安全)。
当然,这两种算法在加/解方面的具体原理是不一样的,但DES加密算法的块大小及密钥长度都不能满足现在的安全需求了,所以现在比较少使用这种加密算法,而是使用像AES或者3DES之类更高级的加密算法。
1、DES的数据块填充
DES的加密过程与上面介绍的AES加密过程有些类似,首先也是需要对明文进行分块。DES是按 64位进行分块(AES是按128位分块),密钥长度为64位(事实上是仅56位参与DES运算,因为第8、16、24、32、40、48、56、64位是专用于校验的,即密钥中的每个字节的第8位均不参与加密运算)。这里也涉及到一个填充的问题,因为一个需加密的原始数据也可能不是64位(8个字节)的整数倍。
在 DES 加密算法中支持的填充方式也有好多,如 PKCS5Padding、ISO10126-2Padding、ISO7816-4Padding、X9.23Padding、TBCPadding、Zero Byte Padding、No Padding填充方式,但最常用的就是前面已在AES加密算法中已介绍的PKCS5Padding填充方式。
PKCS5Padding填充方式的填充方法就是原始数据块与8字节相比差多少个字节就以所缺字节的值填充多少个字节。如一数据块已有5个字节,即还差3个字节,此时就填充三个“3”(每个“3”用一个字节表示);如原始数据块只有一个字节,即还差7个字节,则填充七个“7”(每个“7”也用一个字节表示)。另外要注意,如果原始数据块恰好为8个字节的整数倍,也是要填充的,那就填充8个“8”(每个“8”也用一个字节表示),即要填充8个字节。这样只要读出最后一个字节的内容就知道哪些字节是填充的。
2、DES加/解密原理
DES加密算法与上面介绍的AES加密算法一样,也有不同的工作模式,同样包括ECB、CBC、CFB和OFB这几类,各自的基本工作原理也是一样的。
在DES算法中,加密的过程就是用56位密钥对64位的明文数据块进行16轮的加密处理,最终生成64位的密码文。DES加密是对每个数据块进行加密,所以输入的参数为数据块(64位)和密钥(56位),明文数据块需要经过置换和迭代,密钥也需要置换和循环移位,以产生在分组明文加密过程中各轮迭代计算所需的子密钥(48位)。整个加密过程可用图9来描述。
图9 DES算法加密的基本流程
(1)初始置换
初始置换(Initial Permutation)把输入的64位明文数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长连续的32位。其置换规则为:将数据块的第58位换到第1位,第50位换到第2位,以此类推,最后一位是原始数据块的第7位。各位的对应的原来数据块中的位数相差8,相当于将原明文数据块各字节按列抽出来重新排列。图10是原始明文数据块中各位的位置(图中的数字均代表对应的比特位号),图11是经过初始置换后各比特位所对应的原始明文数据块中的比特位号。L0、R0是置换后的两部分,L0是输出的高32位,R0是输出的低32位。
图10 原始明文密码中各比特位所对应的比特位号
图11 经过初始置换后各比特位所对应的原始明文数据块中的比特号
(2)后续运算
经过初始置换后,再要经过16轮的加密迭代运算。经过16次迭代运算后得到L16、R16。最后一轮迭代的输出有64位,将其左半部分(L16)和右半部分(R16)互换后产生预输出。然后,预输出再采用与初始置换(IP)相逆的操作——即逆初始置换(IP-1)运算,最终产生64位的密文块。逆置换正好是初始置换的逆运算,例如,第1位经过初始置换后处于第40位,而通过逆置换又将第40位换回到第1位。
总体来说,加密迭代的整个过程主要是由加密函数f来实现。首先使用子密钥k1对经过初始置换后的32位R进行加密处理,得到的结果也是32位的;然后再将这个32位的结果数据与经过初始置换后的32位L进行模2处理,从而再次得到一个32位的数据组。这样经过一次迭代后将一个32位数据,它将作为第二次加密迭代的L1,往后的每一次迭代过程都与上述过程相同。
在结束了最后一轮加密迭代之后,会产生一个64位的数据信息组。然后将这个64位数据信息组按原有的数据排列顺序平均分为左右两等分,再将左右两等分的部分进行位置调换,即原来左等分的数据整体位移至右侧,而原来右等分的数据则整体位移至左侧,这样经过合并后的数据将再次经过逆初始置换IP-1的计算,最终将得到一组64位的密文。
(3)DES解密原理
DES解密和加密过程采用相同的算法,并采用相同的加密密钥和解密密钥,解密过程可以看成是加密过程的逆过程。主要体现在以下几个方面:
DES加密是从L、R到L16、R16进行变换,而解密时是从L16、R16到L、R进行变换的;
DES加密时各轮的加密密钥为k1、k2、……、k16,而解密时各轮的解密密钥为k16、k15、……、k1;
DES加密时密钥循环左移,解密时密钥循环右移。
3、子密钥生成原理
各轮迭代运算中,每一轮都需要由密钥单独生成的子密钥参与运算。这就涉及到子密钥的生成问题,注意各轮运算中所生成的子密钥是不一样的。
首先要按如图12所示的固定方式对原密钥进行置换(注意:图中的数字代表比特位号,不是数据),然后再把这56位分成连续的两部分(C、D),每部分各28位,其中C包括高28位,D包括低28位(密钥比特位的编号是从右下角开始,向依次递增,即左上角代表最高比特位,右下角代表最低比特位)。
图12 经过置换后各比特位所对应的原密钥的比特位号
然后在每轮对数据块进行迭代时,这两部分对应的比特位分别在原密钥或上轮子密钥基础上再循环左移1位或2位(具体是第1、2、9、16轮这两部分循环左移一位,其他各轮这两部分均左移2位)生成所需的子密钥。如第一轮中的子密钥就如图13所示(C、D循环左移1位),第2轮的子密钥就如图14所示(C、D在第一轮子密钥基础上再循环左移1位)。
图13 第1轮子密钥各比特位对应于原密钥的比特位
图14 第2轮子密钥各比特位对应于原密钥的比特位
每进行一轮循环左移,就要进行一次压缩置换,以最终得到一个48位的子密钥。压缩的规则是:第9、18、22、25、35、38、43、54位(共8位)数据被丢掉,后面的比特位左移。
4、3DES算法简介
由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES (Triple DES)即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。它也有DES所支持的CBC、ECB、CFB和OFB等几种工作模式,也支持PKCS5Padding、No Padding等填充方式。
在具体加密运算中,3DES是对每个数据块使用3个DES的密钥(即一共192位,实际参与运算的是168位)应用三次DES加密算法对数据块(仍是64位,8个字节)进行三次加密。但所使用的3个密钥不是合并成一个密钥的,而是仍当作三个密钥来使用(假设分别为密钥1、密钥2、密钥3),在3DES加密时依次使用密钥1、密钥2、密钥3对明文数据块进行分别加密,在3DES解密时依次使用密钥3、密钥2、密钥1对密文数据块进行解密。
具体的3DES加密、解密原理其实是与前面介绍的DES加密、解密原理一样,只不过是需要利用3个密钥对数据块进行三次加密或解密。
微信公众号:计算机与网络安全
ID:Computer-network