boxmoe_header_banner_img

欢迎来到烨的世界~

加载中

文章导读

AES


avatar
liuye 2025年4月21日 5

明文长度固定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的作用

  1. 唯一性:对于同一个密钥,每次加密时使用不同的IV可以确保即使相同的明文也会生成不同的密文。这使得攻击者更难以通过分析密文来推断出任何模式或信息。
  2. 随机性:IV应该是随机生成的,以防止攻击者通过分析密文来推断出任何模式或信息。
  3. 完整性:在某些模式下(如CBC模式),IV还用于保证数据的完整性,防止篡改。

为什么需要IV

  • 防止重放攻击:如果使用相同的密钥和IV加密相同的数据,生成的密文将完全相同。攻击者可以通过重放相同的密文来发起攻击。使用不同的IV可以防止这种情况。
  • 增加安全性:即使密钥保持不变,使用不同的IV可以确保每次加密的结果都是唯一的,从而增加了安全性。

具体到你的代码

在你的代码中,IV的作用如下:

  1. 初始化向量:在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)

查看评论列表

暂无评论


发表评论