在void函数C ++

时间:2018-10-21 20:17:21

标签: c++ function encryption openssl

在中断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)中找到其他变量。

此外,在下面的函数中,即使从其他内容(例如err.h)解析而声明了evp.h的项目,例如EVP_CIPHER_CTX * ctx,也无法识别。

 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;
 :
 :

我正在将Visual Studio 2017 Enterprise与openSSL一起使用。有什么建议么?链接配置参数中是否输入了错误的参数?

任何建议都将不胜感激! 谢谢 丽塔

1 个答案:

答案 0 :(得分:1)

在设置Visual Studio项目以使用OpenSSL SDK构建时,您应该执行以下操作(如果Visual Studio设置的名称不太准确,请原谅;我没有在其中运行dev-studio在我的面前,所以我要从记忆中完成所有工作):

  1. 找到将要使用的OpenSSL构建。对于此列表的其余部分,该文件夹将称为OpenSSLDir。
  2. 确保OpenSSLDir中的SDK与您的Visual Studio构建体系结构匹配。如果您使用的是x86 OpenSSL sdk,则您的项目也必须是x86。对于x64同样如此。
  3. 在OpenSSLDir中,有一系列子文件夹:bin,lib,include等。请注意include和lib文件夹,我们将需要这些文件夹。
  4. 在Visual Studio项目中,“ C ++配置”设置(调试和发行版本配置均位于“其他包含目录”设置下。应在此处添加指向OpenSSLDir / include文件夹的完整(或相对)路径
  5. >
  6. 在同一项目中,在“链接”设置下的“其他库目录”下,应在其中添加OpenSSLDir / lib文件夹。
  7. 在同一项目中,“链接设置”下的“其他库输入”(这可能是我最差的名称/位置,但是您应该可以找到它)。在这里,您将libeay32.lib添加到库文件集(应该已经通过继承包含了kernel32.lib,user32.lib等)。如果您还使用SSL_xxx API,则该列表上还需要ssleay32.lib

所有这些都准备就绪,然后便是标题和包含的函数decls的实际用法。在任何使用OpenSSL API的地方,都应通过相关标头插入该API。因为OpenSSLDir / include在include路径中,所以您已经到了一半。 所有OpenSSL标头都应采用以下格式

#include <openssl/evp.h>
#include <openssl/sha.h>
#include <openssl/aes.h>
... etc ...

OpenSSL标头经常(阅读:保证会发生)在SDK中包含 other 标头,它们与完全包含相同的命名法。因此,至关重要的是,将其设置为以相同的方式为您(进而也为他们)工作。按照我提供的说明,它应该可以工作。

在实际运行程序时,我要确保您的构建平台的libeay32.dllssleay32.dll在正确的路径或当前的工作目录中,您。确保OpenSSLDir / bin文件夹位于我们的路径(或Visual Studio调试器的启动设置)中,这是最简单的方法。