编程作业技术问询:AES-CBC场景下如何篡改密文提高转账金额
解决思路:AES-CBC比特翻转攻击 + 完整性标签篡改
首先,你遇到的问题核心是利用AES-CBC模式的固有漏洞(比特翻转攻击)来篡改明文内容,同时适配SHA256完整性验证的要求。下面是分步可行的思路:
1. 先搞懂AES-CBC的篡改特性(核心原理)
CBC模式的解密公式是:明文块P_i = 密钥解密(密文块C_i) XOR 前一个密文块C_{i-1}(其中第一个明文块的C_{i-1}就是IV)。根据异或的特性:
如果你修改
C_{i-1}的某几个字节,那么解密后的P_i对应字节会被精准翻转(等于原明文字节 XOR 修改的差值),而后续的明文块不会受到影响(因为后续块依赖的是未修改的C_i)。
这意味着你不需要破解密钥,只需要通过修改目标明文块的前一个密文块/IV,就能让解密后的明文变成你想要的内容。
2. 定位目标字段,计算篡改所需的异或值
已知原始明文、密文、IV,先做这些操作:
- 把原始明文按AES分组长度拆分(比如AES-128是16字节一组),找到转账金额所在的明文块,比如叫
P_target。 - 构造你想要的目标明文块
P_target_new(比如把"100"改成"999",对应修改P_target里的金额字符)。 - 计算两个块的逐字节异或差值:
delta[i] = P_target[i] XOR P_target_new[i]。 - 找到
P_target对应的前一个密文块:如果P_target是第一个明文块,就修改IV;否则修改C_{target-1}(目标块的前一个密文块),逐字节异或delta,得到新的IV/密文块。
到这一步,解密后的明文已经包含了你想要的金额,但还过不了SHA256验证——因为你需要同时让标签匹配修改后的明文。
3. 适配SHA256完整性验证
你之前修改密文后重算标签失败,说明标签是基于原始明文计算,并且和明文一起被加密了(比如加密内容是明文 + SHA256(明文))。这时候需要同步篡改标签对应的明文块:
- 用修改后的完整明文(包含新金额)计算新的SHA256标签
H_new。 - 找到原始标签在明文中的位置(通常是最后2个AES分组,因为SHA256是32字节),记为
H_old_1和H_old_2。 - 计算
delta_h1[i] = H_old_1[i] XOR H_new[i]、delta_h2[i] = H_old_2[i] XOR H_new[16+i]。 - 修改
H_old_1对应的前一个密文块,逐字节异或delta_h1;修改H_old_2对应的前一个密文块,逐字节异或delta_h2。
这样操作后,解密出来的内容会是修改后的明文 + SHA256(修改后的明文),decrypt类计算SHA256时就会和标签匹配,验证通过。
4. 验证攻击流程
把修改后的IV(如果改了的话)、所有密文块组合起来,发送给decrypt类即可。整个过程不需要破解密钥,完全利用CBC模式的异或特性完成篡改。
内容的提问来源于stack exchange,提问作者HummaMumma
相关产品推荐
相关产品推荐

