“AES_ctr128_encrypt”未在此范围内声明

‘AES_ctr128_encrypt’ was not declared in this scope

我正在测试 this OpenSSL AES-128 CTR 模式加密。

#include <openssl/aes.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <string.h>

我遇到了这个错误(在 C++ 中构建):

../src/AES_OpenSSL_CTR.cpp:128:3: error: ‘AES_ctr128_encrypt’ was not declared in this scope.

我已经包含了 openssl/aes.h。 AES_ctr128_encrypt 已从 OpenSSL 1.1 中删除。1.c?为什么还没有申报?

../src/AES_OpenSSL_CTR.cpp:128:3: error: ‘AES_ctr128_encrypt’ was not declared in this scope

OpenSSL 1.1.1 和 1.1.0 仅提供 AES_encrypt。它是一个纯软件实现。它在完整块上运行。您需要管理计数器,提供增量,加密计数器,并对纯文本进行 XOR。

您应该使用 EVP 接口,而不是使用低级别 AES_encrypt。 EVP 算法在可用时使用硬件加速,并结合 AES-128/CTR 等密码和模式。您要查找的函数是 EVP_aes_128_ctr()。另请参阅 OpenSSL wiki 上的 EVP Symmetric Encryption and Decryption

如果您提供 Minimal, Complete, and Verifiable example,那么我们可以详细说明您可以采取哪些措施来解决该问题。


如果你想使用AES_ctr128_encrypt,那么你需要退回到OpenSSL 1.0.2。 OpenSSL 1.1.1 和 1.1.0 不再提供它。

$ git checkout OpenSSL_1_0_2-stable
Branch 'OpenSSL_1_0_2-stable' set up to track remote branch 'OpenSSL_1_0_2-stable' from 'origin'.
Switched to a new branch 'OpenSSL_1_0_2-stable'

$ grep -IR AES_ctr128_encrypt
util/libeay.num:AES_ctr128_encrypt                      3216    EXIST::FUNCTION:AES
crypto/aes/aes.h:void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
crypto/aes/aes_ctr.c:void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,

如果您回到 OpenSSL 1.0.2,请参阅 AES CTR 256 Encryption Mode of operation on OpenSSL


由于您有 C++ 程序,您可能会对 OpenSSL wiki 上的 EVP Encryption ... | C++ Programs 感兴趣。它使用 std::unique_ptrsecure_string 来管理 OpenSSL 资源。 secure_string 是一个带有安全分配器的 std::basic_string typedef。它很好地清理了 OpenSSL C 代码。


I am testing this OpenSSL AES-128 CTR mode encryption...

是的,这就是博客的问题(更不用说 2012 年的博客了)。最好按照项目所说的进行操作。 OpenSSL 项目说要使用 EVP 接口。