一、AES
AES,又称为Rijndael加密法,是美国联邦政府采用的一种区块加密标准,这是一种对称加密算法
加密公式为
C=E(k,p),k是密钥,p是明文,c是密文,E代表加密函数
加密过程为
先将明文进行分组,每组长度为128位,然后一组一组加密,直到所有明文都已加密。密钥的长度可以是 128、192 或 256 位。
在加密函数 E 中,会执行一个轮函数,除最后一次执行不同外,前面几轮的执行是相同的。
以 AES-128 为例,推荐加密轮数为 10 轮,即前 9 轮执行的操作相同,第 10 轮执行的操作与前面不同。不同的密钥长度推荐的加密轮数是不一样的
加密时,明文按照 128 位为单位进行分组,每组包含 16 个字节,按照从上到下、从左到右的顺序排列成一个 4 × 4 的矩阵,称为明文矩阵(状态矩阵)。每一轮加密结束后,状态矩阵的值变化一次。轮函数执行结束后,状态矩阵的值即为密文的值,从状态矩阵得到密文矩阵,依次提取密文矩阵的值得到 128 位的密文。
AES 通过密钥编排函数把密钥矩阵扩展成一个包含 44 个字的密钥序列,其中的前 4 个字为原始密钥用于初始加密,后面的 40 个字用于 10 轮加密,每轮使用其中的 4 个字。这里生成轮密钥的规则就是
(1) 如果 i 不是 4 的倍数,那么由等式 w[i] = w[i-4] ⊕ w[i-1] 确定;(w[i-1]是前一个轮密钥,w[i-4]是更早的密钥,⊕是按位异或(XOR)中的操作,将二进制序列逐位异或运算)
(2) 如果 i 是 4 的倍数,那么由等式 w[i] = w[i-4] ⊕ T(w[i-1]) 确定。(T()是一个非线性的字节替换函数和一个循环左移函数的组合,字节替换函数用于对轮密钥的每个字节进行非线性替换,循环左移函数是将字节序列向左循环移动一个固定的位置)
加密的第 1 轮到第 9 轮的轮函数一样,包括 4 个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。
1.字节代换
通过一个称为S-box的8位查找表来完成,这个S-box提供了非线性的转换能力,增强了加密算法的安全性。S-box的设计基于有良好非线性特性的乘法反元素(乘法反元素是指对于每个非零元素a,存在一个b,使得a * b ≡ 1 (mod 2^8),在S-box中,将每个字节,视为GF(2^8)中的元素,并与乘法反元素进行乘法运算,就可以实现一种非线性的字节替换操作),并结合了一个可逆的仿射变换矩阵。这种设计不仅增加了加密的混淆性,还能抵御简单的代数攻击。
在构建S-box时,特别避免了固定点和反固定点,确保了通过S-box替换字节后的结果与原字节之间的关系是错位的,增加了加密算法的复杂性和难以破解性
2.行位移
—将矩阵中的每个横列进行循环式移位。
ShiftRows描述矩阵的行操作。在此步骤中,每一行都向左循环位移某个偏移量。在AES中(区块大小128位),第一行维持不变,第二行里的每个字节都向左循环移动一格。同理,第三行及第四行向左循环位移的偏移量就分别是2和3。128位和192比特的区块在此步骤的循环位移的模式相同。经过ShiftRows之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。Rijndael算法的版本中,偏移量和AES有少许不同;对于长度256比特的区块,第一行仍然维持不变,第二行、第三行、第四行的偏移量分别是1字节、3字节、4位组。除此之外,ShiftRows操作步骤在Rijndael和AES中完全相同
3.列混合(MixColumns)
对每一列的四个字节进行线性变换组合。每个字节被视为多项式中的系数,分别对应于1、x、x^2和x^3。这四个元素合并成一个多项式,并与一个固定的多项式c(x)=3x^3+x^2+x+2在模x^4+1的情况下进行乘法运算。
这个过程可以看作在有限域GF(2^8)中进行的矩阵乘法操作。MixColumns函数接受四个字节作为输入,然后输出四个字节。每个输入字节都会对输出的四个字节产生影响,通过特定的线性组合和乘法运算,实现了列与列之间的混淆和扰乱,增加了加密算法的复杂性和安全性
3.轮密钥加 AddRoundKey
回合密钥将会与原矩阵合并。在每次的加密循环中,都会由主密钥产生一把回合密钥(通过 Rijndael 密钥生成方案产生),这把密钥大小会跟原矩阵一样,以与原矩阵中每个对应的字节作异或(⊕)加法。
二、DES
DES也是一种对称加密算法,使用56位的密钥和64位的明文块进行加密,分组大小是64位,,因此,如果需要加密的明文长度不足64位,需要进行填充;如果明文长度超过64位,则需要使用分组模式进行分组加密。
1.加密流程
输入一条64位的数据后,进行如下加密
来源:通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码-CSDN博客
1、初始置换(IP置换):将输入的64位明文块进行置换和重新排列,生成新的64位数据块。
我们将把64位的顺序按下表中规定的顺序放置,图中的数字是在64位明文中每个比特的索引位置。在DES中,这个置放规则是固定的。
即将原来位于第58个位置的数据放在第1个位置,原来位于第50个位置的元素放在第2个位置,第42个放在第3个,34->4以此类推…
2、加密轮次:DES加密算法共有16个轮次,每个轮次都包括四个步骤:
a. 将64位数据块分为左右两个32位块。
b. 右侧32位块作为输入,经过扩展、异或、置换等操作生成一个48位的数据块。这个48位的数据块被称为“轮密钥”,它是根据加密算法的主密钥生成的子密钥。
c. 将左侧32位块和轮密钥进行异或运算,结果作为新的右侧32位块。
d. 将右侧32位块与原来的左侧32位块进行连接,生成一个新的64位数据块,作为下一轮的输入。
3 末置换(FP置换):在最后一个轮次完成后,将经过加密的数据块进行置换和重新排列,得到加密后的64位密文。
2.详细步骤