如何破解使用相同IV的AES-GCM加密实现?
我来一步步帮你拆解这两个攻击场景的具体实现——你遇到的问题其实是固定IV(尤其是GCM模式下)+固定密钥带来的典型对称加密漏洞,下面分两个场景具体说明:
一、推导两个明文的按位异或结果
这个攻击的核心利用了流密码(包括GCM的加密阶段)的特性:密文 = 明文 XOR 密钥流,而固定IV+固定密钥意味着两次加密使用的密钥流完全相同。
前提假设
假设你使用的是AES-GCM(12字节IV是GCM标准长度,且你提到了内部认证值,大概率是该模式),且两次加密满足:
- 相同的32字节密钥(SHA512哈希生成)
- 相同的12字节全0IV
- 明文长度相同(如果不同,仅能推导前N个字节的异或,N为较短明文的长度)
具体实现步骤
获取目标密文:拿到两组对应相同IV/密钥的密文
C1(对应明文P1)和C2(对应明文P2),注意要排除GCM的认证标签,只取密文主体部分。执行按位异或操作:根据流密码加密公式:
C1 = P1 XOR S,C2 = P2 XOR S(S为固定密钥流)
推导得:P1 XOR P2 = C1 XOR C2用C语言(适配OpenSSL EVP场景)实现的代码片段:
// 假设c1、c2是密文主体缓冲区,len为两者的共同长度 unsigned char p_xor[len]; for (int i = 0; i < len; i++) { p_xor[i] = c1[i] ^ c2[i]; } // p_xor数组即为P1和P2的按位异或结果
二、推导内部认证值并修改密文不被检测
这个攻击针对GCM的认证标签机制,GCM的标签计算公式为:
Tag = GHASH(附加数据AD || 密文C) XOR E(K, J0)
其中J0是由IV生成的初始计数器值,固定IV+固定密钥意味着E(K, J0)是一个固定值,我们可以预先计算出来。
具体实现步骤
1. 预计算固定的E(K, J0)值
E(K, J0)是密钥K加密初始计数器J0的结果,由于IV固定,我们可以通过加密空明文来直接获取:
unsigned char iv_zero[12] = {0}; // 固定的12字节全0IV unsigned char key[32]; // 你的32字节SHA512哈希密钥 unsigned char j0_encrypted[16]; // 存储E(K, J0)结果 EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); // 初始化AES-256-GCM上下文,传入密钥和固定IV EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv_zero); // 加密空数据,触发标签生成 int len; EVP_EncryptFinal_ex(ctx, NULL, &len); // 获取标签,此时标签就是E(K, J0)(因为空明文+空AD的GHASH结果为0) EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, j0_encrypted); EVP_CIPHER_CTX_free(ctx);
2. 生成修改后密文的合法认证标签
当你想要修改密文为C'时,需要生成对应的合法标签,让接收方验证通过:
unsigned char C_prime[...]; // 修改后的密文主体 size_t C_prime_len = ...; // 修改后密文长度 unsigned char AD[...]; // 原始加密时的附加数据(如果没有则为空) size_t AD_len = ...; unsigned char new_tag[16]; // 存储新的合法标签 EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL); // 重新传入密钥和固定IV EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv_zero); // 处理附加数据(如果有) if (AD_len > 0) { EVP_EncryptUpdate(ctx, NULL, &len, AD, AD_len); } // 处理修改后的密文C' EVP_EncryptUpdate(ctx, NULL, &len, C_prime, C_prime_len); // 获取新的合法标签 EVP_EncryptFinal_ex(ctx, NULL, &len); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, new_tag); EVP_CIPHER_CTX_free(ctx);
3. 完成密文篡改
将修改后的密文C'和新标签new_tag组合后发送给接收方,接收方用相同的密钥、IV、附加数据验证时,会认为这是合法的加密数据,完全检测不到篡改。
关键注意事项
- 这些攻击仅在IV固定的场景下有效,GCM模式要求每次加密必须使用唯一IV,否则会直接暴露上述漏洞。
- 固定密钥本身也是严重问题,但本次攻击的核心触发点是固定IV。
- 如果你使用的是其他模式(如CBC),固定IV的漏洞表现不同,但你提到了内部认证值,所以优先针对GCM模式设计。
内容的提问来源于stack exchange,提问作者bli00




