对称密码体制DES、3DES、AES
DES
DES采用了64位的分组长度 和56位的密钥长度,它将64位的输入经过一系列变换得到64位的输出,解密则使用了相同的步骤和密钥。
- 对明文的处理
- 64位明文经过初始置换而被重新排列
- 进行16轮相同函数的作用,每轮作用都有置换和代替。
- 密钥的处理
密钥经过一个置换后,再经过一个置换后,再经过循环左移和一个置换分别得到各轮的子密钥Ki用于各轮的迭代。每轮的置换函数都一样,但是由于密钥的循环移位使得各轮子密钥各不相同。 DES具体每一轮的流程图如下所示:
关于F函数,其主要的操作过程如下:
关于S盒,其过程如下图所示:
其中,需要注意的是:
DES的密钥长度为56,IBM标准提出是要使用64位长的密钥,但是实际中DES算法只用了64位中的56位密钥
子密钥产生器:将64 bit初始密钥经过置换选择PC1、循环移位置换、置换选择PC2给出每次迭代加密用的子密钥ki
- 选择置换(PC1):从64位输入密钥中选出56位的密钥—剩下的8位要么直接丢弃,要么作为奇偶校验位。
- 选择置换(PC2):该置换从56位的密钥调度状态中取出48位的子密钥
3DES
3DES是针对DES算法密钥过短、存在安全性的问题而改进的一个措施。其实只是通过简单的执行3次DES来达到增加密钥长度和安全而已。其加密解密过程如下图所示:
使用3个密钥进行3次DES算法,过程按照加密-解密-加密(EDE)
3DES加密过程中的第二步使用的解密没有密码方面的意义,唯一好处是让3DES的使用者能够解密原来的单重DES使用者加密的数据。
AES
由于DES的密钥太短,容易受到穷举攻击,因此用AES来代替DES,比3DES的安全性更高,且目前很多处理器都提供基于硬件的指令来加速AES的调用。
- AES的轮数依赖于密钥长度,16字节密钥是10轮,24字节对应12轮,32字节对应14轮。
- AES不是Feistel结构, AES在每一轮都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。
- 输入的密钥被扩展成44个32比特字的数组w[i],4个不同的字(128比特)用作每轮的轮密钥。
- 每轮由4个不同的阶段组成,包括一个置换和3个代替:
- 字节代替(Substitute Bytes):用一个S盒完成分组的字节到字节的代替
- 行移位(ShiftRows):一个简单的置换
- 列混淆(MixColumns):利用域GF(2^8)上的算术特性的一个代替
- 轮密钥加(AddRoundKey):当前分组和扩展密钥的一部分进行按位异或
轮密钥加变换非常简单,却影响状态中的每一位。密钥的扩展复杂性和AES的其他阶段运算的复杂性,确保了该算法的安全性。
- 字节代替(Substitute Bytes):用一个S盒完成分组的字节到字节的代替
- 算法结构非常简单
- 仅仅在轮密钥加阶段中使用密钥
- 轮密钥加步骤本身并不强大,另外3个步骤一起打乱了数据比特,但因为没有使用密钥,他们本身并不安全。密码先做异或加密(轮密钥加)操作,再打乱分组(另外3个步骤),再做异或处理,这个结构既高效又安全。
- 每个阶段均可逆(轮密钥加的逆就是利用同样的轮密钥分组和分组相异或,即A+B+B=A,+表示异或)
- 加密和解密过程中的最后一轮均只包含3个阶段
DES,3DES和AES的比较
- DES的密钥太短,容易被穷举攻击,因此不安全
- 3DES使用168比特密钥长度,克服了DEA对付穷举攻击的不足;3DES的底层加密算法和DEA相同,除穷举法以外没有任何有效的基于此算法的攻击