You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何破解使用相同IV的AES-GCM加密实现?

针对固定IV/密钥场景下的加密漏洞攻击实现详解

我来一步步帮你拆解这两个攻击场景的具体实现——你遇到的问题其实是固定IV(尤其是GCM模式下)+固定密钥带来的典型对称加密漏洞,下面分两个场景具体说明:


一、推导两个明文的按位异或结果

这个攻击的核心利用了流密码(包括GCM的加密阶段)的特性:密文 = 明文 XOR 密钥流,而固定IV+固定密钥意味着两次加密使用的密钥流完全相同。

前提假设

假设你使用的是AES-GCM(12字节IV是GCM标准长度,且你提到了内部认证值,大概率是该模式),且两次加密满足:

  • 相同的32字节密钥(SHA512哈希生成)
  • 相同的12字节全0IV
  • 明文长度相同(如果不同,仅能推导前N个字节的异或,N为较短明文的长度)

具体实现步骤

  1. 获取目标密文:拿到两组对应相同IV/密钥的密文C1(对应明文P1)和C2(对应明文P2),注意要排除GCM的认证标签,只取密文主体部分。

  2. 执行按位异或操作:根据流密码加密公式:

    C1 = P1 XOR SC2 = 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

火山引擎 最新活动