Python实现AES MixColumns列混合功能输出与预期不符问题咨询
AES MixColumns 实现偏差排查
测试场景
正在使用Python编写AES标准的MixColumns列混合函数,针对状态矩阵首列做单元测试时,程序输出与预期值存在偏差,无法定位错误来源。
测试基础参数
- 标准MixColumns变换矩阵(按行展开):
[2, 3, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 3, 1, 1, 2] - 测试用状态矩阵输入:
[0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
测试代码
# 针对状态首列的逐行乘加验证 print((0*2)^(17*3)^(34*1)^(51*1)) print((0*1)^(17*2)^(34*3)^(51*1)) print((0*1)^(17*1)^(34*2)^(51*3)) print((0*3)^(17*1)^(34*1)^(51*2))
结果对比
- 代码实际运行输出:
34 119 204 85
- 预设的预期输出:
34 119 0 85
问题定位
- 核心运算逻辑错误:AES规范中MixColumns的矩阵乘法,全部是GF(2^8)有限域上的多项式乘法,不能直接使用Python原生的整数乘法运算。当前代码用普通整数乘法代替域乘法,天然不符合算法规范。
- 预期值与实际值的差异来源:
代码中第三行的运算,对51 * 3的计算采用普通整数乘法得到结果153;但按GF(2^8)域规则,51乘3的正确结果是85。两者的差值直接导致最终异或的结果从预期的0变成了实际输出的204。第三行的正确GF域计算过程:
- 系数1乘输入17:结果为17
- 系数2乘输入34:GF域乘2等价于左移1位,34(0x22)左移为68(0x44),无高位溢出无需异或化简项0x1b
- 系数3乘输入51:GF域乘3等价于(乘2 异或原数),51(0x33)乘2为102(0x66),异或原数51后得到85(0x55)
- 所有项异或求和:0 ^ 17 ^ 68 ^ 85 = 0,和你预设的预期值完全一致
- 其余输出值的巧合性:前三个输出中,其余乘法项的普通整数运算结果,刚好和GF域乘法结果一致,所以出现了前两个值和预期匹配、第三个值不匹配的情况。
内容的提问来源于stack exchange,提问作者stucked
相关产品推荐
相关产品推荐

