明文长度固定128位也就是16字节,而密钥三种128.192.256
明文以矩阵4*4形式排列
加密过程分初始变换,九轮循环为字节代换,行移位,列混合,轮密钥加,最后一轮时会将列混合去掉,这个过程后便是密文。
下来看初始变换:
初始变换是先把明文和密钥按4*4矩阵排列,排列后按照每个字节一一对照异或进行操作即可。
由此初始变换结束,开始循环中的字节代换:
刚刚初始变换后得到了一个4*4矩阵,这时有一个s表用作映射,比如4*4的矩阵第一格是19,那对应就是第一行第九列d4,3d就对应27,以此类推:
字节代换后开始进行行移位:
就是第一行不变,后面每n行向左移动n-1位即可。
下来进行列混合
将行移位后的4*4矩阵与正矩阵左乘,这个正矩阵是固定不变的,恒为图示。
然后轮密钥加
列混合的矩阵每一位和每轮的密钥进行一一对应异或,这个每轮密钥是由最初的密钥矩阵通过密钥扩展得到。
密钥扩展过程:
密钥扩展过程基于基础密钥通过公式 扩展而来
第一列是W0列,原本蓝色是4*4基础密钥,从这里先说W5,因为W4是4的倍数,过程困难。W5也就是图中Wi正下方的一列,根据公式,他应该是W4和W1进行异或得来的,如图28^a0,ae^fa,d2^fe,a6^17。
然后来看如果Wi的i是4的倍数时,扩展的过程:
如果i是4的倍数,那么Wi是由Wi-4和T函数处理的Wi-1进行异或得到的。
T函数再次由字循环,字节代换和轮常量异或得到
字循环:
字循环说白的就是将Wi-1全部向上移位,第一位换到最后一位。如图
这里字节代换和前面循环一样,把对应的密钥和映射的s盒做对应映射替换。如图
最后轮常量异或,这里轮常量是固定不变的,如图所示,因为总共要循环十轮也就有十组轮常量,每轮对应其中一组进行异或即可得到经过T函数处理的Wi-1数据,然后再与Wi-4进行异或便得到了4的倍数的情况下的密钥扩展结果。以此类推便得到了十轮的轮密钥加的密钥了
然后通过九轮循环和最终轮即可得到密文。
这个过程通常是自动的,如果实操过程主要是由明文,密钥,iv三大因素决定密文。
iv:
理解IV(Initialization Vector)在AES加密中的作用是非常重要的。虽然S-box和轮常量是固定的,但IV的作用是确保相同的明文在不同的加密过程中生成不同的密文。这增加了加密的安全性和不可预测性。
IV的作用
- 唯一性:对于同一个密钥,每次加密时使用不同的IV可以确保即使相同的明文也会生成不同的密文。这使得攻击者更难以通过分析密文来推断出任何模式或信息。
- 随机性:IV应该是随机生成的,以防止攻击者通过分析密文来推断出任何模式或信息。
- 完整性:在某些模式下(如CBC模式),IV还用于保证数据的完整性,防止篡改。
为什么需要IV
- 防止重放攻击:如果使用相同的密钥和IV加密相同的数据,生成的密文将完全相同。攻击者可以通过重放相同的密文来发起攻击。使用不同的IV可以防止这种情况。
- 增加安全性:即使密钥保持不变,使用不同的IV可以确保每次加密的结果都是唯一的,从而增加了安全性。
具体到你的代码
在你的代码中,IV的作用如下:
- 初始化向量:在CBC模式下,第一个块的加密依赖于IV。具体来说,第一个明文块会与IV进行异或操作,然后再进行加密。后续的每个块则依赖于前一个块的密文。
示例解释
假设你有以下明文块 P1, P2, P3, ...
和IV IV
,在CBC模式下的加密过程如下:
- 第一个块:
C1 = E(K, (P1 ⊕ IV))
- 第二个块:
C2 = E(K, (P2 ⊕ C1))
- 第三个块:
C3 = E(K, (P3 ⊕ C2))
- 以此类推…
其中 E(K, X)
表示用密钥 K
对数据 X
进行加密。
代码中的IV
在你的代码中,IV被定义为 '1229002635654321'
,并被传递给 AES.new
方法:
<PYTHON>
iv = ‘1229002635654321’key = ‘nssctfneedcrypto’data = getflag()def pad(data): pad_data = data for i in range(0, 16 – len(data)): pad_data = pad_data + ‘ ‘ return pad_datadef AES_en(key, data): if len(data) < 16: data = pad(data) AES_obj = AES.new(key.encode(“utf-8”), AES.MODE_CBC, iv.encode(“utf-8”)) AES_en_str = AES_obj.encrypt(data.encode(“utf-8”)) AES_en_str = base64.b64encode(AES_en_str) AES_en_str = AES_en_str.decode(“utf-8”) return AES_en_strdata = AES_en(key, data)print(data)
在这个代码中,IV的作用是确保每次加密时,即使是相同的明文,生成的密文也是不同的。如果你每次都使用相同的IV,那么相同的明文块会产生相同的密文块,这会降低安全性。
总结
- IV 是为了确保相同的明文在不同的加密过程中生成不同的密文。
- S-box 和 轮常量 是固定的,用于实现AES算法的具体步骤。
- 密钥 和 明文 是加密的主要输入,而 IV 用于增加加密的安全性和不可预测性。
评论(0)
暂无评论