【发布时间】:2018-10-21 20:17:20
【问题描述】:
我在中断 15 年后回到 C++,一直在努力记住如何使 #include 中的变量/函数可用于 void 函数。目前,我使用的是单个 .cpp,但会将函数导出到单独的 .cpp 以根据需要调用。
我有以下:
// C++
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <errno.h>
#include <cstring>
// OpenSSL
#include <evp.h>
#include <aes.h>
#include <rand.h>
#include <err.h>
#include <buffer.h>
using namespace std;
typedef struct _cipher_params_t {
unsigned char *key;
unsigned char *iv;
unsigned int encrypt;
const EVP_CIPHER *cipher_type;
}cipher_params_t;
EVP_CIPHER 在 evp.h 文件中,但似乎无法找到它。我的包含路径似乎正在工作,因为当我键入 #include 时我可以看到/选择模块,它会在其他包含 (aes.h) 中找到其他变量。
此外,在下面的函数中,不能识别来自 evp.h 的项目,例如 EVP_CIPHER_CTX *ctx,即使它已声明,而其他项目是从其他包含(如 err.h)解析的。
void file_encrypt_decrypt(cipher_params_t *params, FILE *ifp, FILE *ofp) {
/* Allow enough space in output buffer for additional block */
int cipher_block_size = EVP_CIPHER_block_size(params->cipher_type);
unsigned char in_buf[BUFSIZE], out_buf[in_buf + cipher_block_size];
int num_bytes_read, out_len;
EVP_CIPHER_CTX *ctx;
:
:
我正在使用带有 openSSL 的 Visual Studio 2017 Enterprise。有什么建议么?链接配置参数中的参数错误?
非常感谢任何建议! 谢谢 丽塔。
【问题讨论】:
-
stackoverflow 上通常的经验法则是,如果您遇到错误(编译或运行时),请将完整的错误消息复制并粘贴到您的问题中。
-
EVP_CIPHER 和 EVP_CIPHER_CTX 实际上是在ossi_typ.h 中定义的,并且该文件包含在evp.h 中。不知道为什么这对你不起作用。您可以尝试将
#include <openssl/ossl_typ.h>行放在您的代码中,位于 OpenSSL 包含的顶部。不过,不确定这是否会有所帮助。希望你能得到答案。 -
C++ 中不需要
typedef struct。看起来你可能会更乐意用 C 写这个。 -
任何库存的 OpenSSL sdk 版本都有一个名为
include的文件夹。该文件夹应添加到项目的包含路径中(因此您的源文件会编译)。在该文件夹中是文件夹链openssl/*。我知道这看起来很混乱,但它可以确保你得到你想要的标题。所有的 openssl 标头都应该是#include <openssl/headernamehere.h>它很重要,因为在这些标头中包含 other 标头,其中一些也在 openssl 包含文件夹中并使用 same 命名法. -
谢谢大家!我快到了。只是想找到 cleanup() 的位置,然后我就可以开始了。我在我的工作计算机(不同版本的 openSSL)上工作,但在我的家用计算机上苦苦挣扎。 @NeilButterworth,我最好用 C 编写,但我被指示使用 C++ 和 EVP/AES。
标签: c++ function encryption openssl