无法解析的外部符号 EVP_EncryptFinal_ex

本文介绍了在使用EVP_EncryptFinal_ex时遇到的无法解析外部符号的问题及其原因。该问题通常出现在将平台从Win32切换到x64时。文章详细解释了解决方案:需要引入正确的64位库文件。

无法解析的外部符号 EVP_EncryptFinal_ex
这里写图片描述

原因是缺少对应版本的Lib;
Win32下编译是没有问题的,但平台配置为x64的就不行了。
这里写图片描述
需要引用 对应的64位的Lib.

在使用 `EVP_CIPHER_CTX_set_padding(ctx, 0)` 禁用填充后,对 `EVP_EncryptFinal_ex` 函数的调用及其参数处理方式会产生直接影响。具体而言,禁用填充意味着加密操作将不再自动处理数据长度未对齐的情况。 通常情况下,当启用默认的 PKCS#7 填充时,`EVP_EncryptFinal_ex` 会处理剩余的不完整块,并根据标准填充规则进行填充以满足分组密码对数据长度的要求。例如,在 AES 加密中,明文长度必须是 16 字节的整数倍,否则就会通过填充来补齐 [^2]。 然而,在禁用填充的情况下(即通过 `EVP_CIPHER_CTX_set_padding(ctx, 0)` 设置),以下几点会对 `EVP_EncryptFinal_ex` 的行为产生影响: - **输入数据长度要求**:用户必须确保传入 `EVP_EncryptUpdate` 的数据总长度是分组大小的整数倍。如果数据长度不符合要求,则 `EVP_EncryptFinal_ex` 会返回错误,因为此时无法再依赖填充机制来补足不足一个块的数据 [^1]。 - **输出缓冲区空间需求**:由于不会产生填充数据,因此不需要为 `out` 缓冲区额外预留一个完整块的空间。但在实际调用 `EVP_EncryptFinal_ex` 时,仍需保证 `out` 有足够的空间用于存放可能产生的最终块,尽管该块可能仅包含部分数据或无数据 [^2]。 - **函数返回值与 `outl` 参数**:若数据长度正确且没有需要填充的内容,`EVP_EncryptFinal_ex` 将正常写入最终的加密块到 `out` 中,并更新 `outl` 指示写入的字节数;若数据长度不对齐,则操作失败并返回 0,同时 `outl` 不会被修改 [^2]。 综上所述,禁用填充后,开发者需自行管理数据长度对齐问题,并确保所有传递给 `EVP_EncryptFinal_ex` 的数据已经完全对齐,否则可能导致加密失败。 ### 示例代码 以下是一个简单的代码示例,展示如何禁用填充并调用 `EVP_EncryptFinal_ex`: ```c #include <openssl/evp.h> #include <string.h> #include <stdio.h> int main() { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); unsigned char key[32], iv[16]; unsigned char in[16] = "This is a test."; unsigned char out[128]; int out_len; // 初始化key和iv(此处仅为示例) memset(key, 0x00, 32); memset(iv, 0x00, 16); // 初始化加密上下文并禁用填充 EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv); EVP_CIPHER_CTX_set_padding(ctx, 0); // 禁用填充 // 执行加密更新 if (!EVP_EncryptUpdate(ctx, out, &out_len, in, 16)) { printf("EVP_EncryptUpdate failed\n"); return -1; } // 调用EVP_EncryptFinal_ex,由于禁用了填充,in数据必须是16字节的整数倍 if (!EVP_EncryptFinal_ex(ctx, out + out_len, &out_len)) { printf("EVP_EncryptFinal_ex failed (no padding)\n"); return -1; } EVP_CIPHER_CTX_free(ctx); return 0; } ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值