You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenSSL排查AES-128-CBC加密密钥匹配失败问题

代码错误排查与修正

我帮你梳理了代码里的几个关键问题,这些正是导致你无法匹配正确密文的原因,逐个来看:

1. 致命的代码块大括号错误

你在EVP_EncryptUpdate的错误处理部分漏了大括号,导致不管加密更新操作是否成功,程序都会直接执行return 0退出,循环根本没机会继续执行下去:

错误代码片段:

if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inText, strlen(inText)))
    EVP_CIPHER_CTX_cleanup(&ctx);
    return 0;
}

修正后:

if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inText, strlen(inText))) {
    EVP_CIPHER_CTX_cleanup(&ctx);
    return 0;
}

这里必须用大括号把错误处理的语句块包裹起来,否则return 0会成为独立语句,每次循环执行到这里就直接退出程序了。

2. EVP_CIPHER_CTX 未循环初始化/清理

你只在main函数开头做了一次EVP_CIPHER_CTX_init(&ctx),但在循环中重复使用同一个加密上下文,会残留上一次加密的状态,导致后续加密结果错误。

修正方案:
把上下文的初始化和清理放到循环内部,每次处理一个密码时重新初始化:

while ( fgets(words,17,key)) { // 这里words数组大小也要改,后面说明
    // ... 处理密码填充的代码 ...
    
    EVP_CIPHER_CTX_init(&ctx); // 循环内重新初始化
    if(!EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, (unsigned char*)words, iv)) {
        EVP_CIPHER_CTX_cleanup(&ctx);
        continue;
    }
    
    // ... 加密更新、最终块处理的代码 ...
    
    EVP_CIPHER_CTX_cleanup(&ctx); // 每次加密完成后清理上下文
}

3. 密码数组越界问题

你定义的char words[16]只能容纳15个有效字符加一个终止符,但当需要填充到16个#时,pad函数里的s[l] = '\0'会写到words[16]的位置,这属于数组越界,会破坏内存数据。

修正方案:
把words的数组大小改为17,确保能容纳16个密码字符加一个终止符:

char words[17],t; // 从16改为17

同时修改fgets的读取长度:

while ( fgets(words,17,key))

4. 密文字符串终止符错误

在生成十六进制密文字符串时,你写了*(buf_ptr + 1) = '\0';,这是错误的。因为buf_ptr已经通过sprintf移动到了字符串的末尾位置,直接给*buf_ptr赋值终止符即可:

错误代码:

*(buf_ptr + 1) = '\0';

修正后:

*buf_ptr = '\0';

否则会导致字符串末尾多占一个字节,或者出现垃圾数据,影响后续的字符串比较。

5. 变量重定义问题

在main函数的循环内部,你重新定义了int i;,但main函数开头已经定义过这个变量,这在C89标准中是不允许的,部分编译器可能会报错或者出现未定义行为。

修正方案:
去掉循环内的int i;,直接使用之前定义的i变量即可。

6. AES密钥类型不匹配

EVP_EncryptInit_ex的密钥参数要求是unsigned char*类型,而你传入的是char*的words,虽然大部分情况下不会出问题,但最好显式转换类型避免潜在问题:

EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, (unsigned char*)words, iv);

把这些错误都修正后,你的代码应该就能正确生成密文并匹配到Syracuse########这个密钥了。

内容的提问来源于stack exchange,提问作者Amin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:04:15