AES-128加解密C代码调试:解密结果错误求助
AES-128解密结果不符问题排查(无查表、GF(2^8)运行时计算实现)
我实现了不依赖额外库/头文件的AES-128加解密代码,为避免查表,采用运行时计算GF(2^8)乘法的方式,但解密结果始终和原明文不一致。
原始明文:
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
加密密文:ec d5 9c a4 41 cb cb e5 08 02 a3 cc 7c 39 be 74
解密结果:37 b8 75 c5 01 5c 74 14 b4 e9 11 d8 3c 16 cd c2
核心排查方向
1. GF(2^8)乘法实现验证
AES的GF(2^8)乘法需模0x11B(多项式x⁸+x⁴+x³+x+1),运行时计算易出问题的点:
- 移位后异或逻辑:当字节最高位为1时,左移1位后必须异或
0x11B,确保运算始终在8位范围内,避免高位溢出干扰 - 用已知测试用例验证:比如
0x02 * 0x80应得0x1B,0x03 * 0x95应得0xDA,如果函数输出不符,直接定位乘法函数错误
2. 解密轮函数顺序检查
AES加密轮顺序:字节代换→行移位→列混合→轮密钥加;解密轮必须严格逆序:轮密钥加 → 逆列混合 → 逆行移位 → 逆字节代换
如果颠倒了逆列混合和逆行移位的顺序,或漏掉某一步,必然导致解密失败
3. 逆S盒实现正确性
无查表的逆S盒需先做GF(2^8)求逆,再做逆仿射变换,易出错点:
- 求逆逻辑:GF(28)中0的逆元是0,非0元素可通过费马小定理(x254 mod 0x11B)或扩展欧几里得算法计算,检查求逆函数是否返回正确结果
- 逆仿射变换:不要复用加密S盒的仿射代码,逆仿射是加密仿射的反向操作,加密仿射为
b' = b ^ (b<<1) ^ (b<<2) ^ (b<<3) ^ (b<<4) ^ 0x63,逆仿射需反向推导计算
4. 逆列混合系数错误
解密逆列混合使用的是加密列混合矩阵的逆矩阵,对应的GF(2^8)系数为0x0E, 0x0B, 0x0D, 0x09,不要误用加密时的0x02, 0x03, 0x01, 0x01系数,检查逆列混合中的乘法系数是否正确
5. 轮密钥使用顺序错误
解密时轮密钥需按加密轮密钥的逆序使用:加密的第10轮密钥作为解密的第0轮密钥,然后依次往前取第9、8...0轮密钥,不要直接顺序使用加密生成的轮密钥
6. 最后一轮解密的特殊处理
加密最后一轮无列混合,对应解密最后一轮也无逆列混合,检查解密循环是否正确跳过了最后一轮的逆列混合步骤
内容的提问来源于stack exchange,提问作者Lakshmi Srikanta
相关产品推荐
相关产品推荐

