18

嗨,我已经在我的 linux 机器上安装了 openssl 并浏览了头文件和文档(这是非常不足的 :( )。

我正在尝试构建一个使用对称加密算法的项目(在“c”中)(我专注于 aes256cbc)。问题是我对如何在我的代码中使用库函数感到困惑。

对于我的 aes256cbc 实现,我可以直接使用“aes.h”头文件中定义的函数(首先出现在我看来)。

但是在谷歌搜索时,我遇到了一些使用 'evp.h' 函数来执行此操作的教程http://saju.net.in/code/misc/openssl_aes.c.txt

是否有特定原因或直接访问 aes.h 函数更好。

而且,如果有人可以向我指出有关使用 openssl 加密库的任何类型的良好文档/教程,我将不胜感激。

非常感谢

PS如果我太天真,请原谅我

4

2 回答 2

28

使用 EVP API 的优势在于,您可以以通用方式对 OpenSSL 支持的所有对称密码使用相同的 API。这使得替换使用的算法变得更容易,或者使算法在以后阶段可由用户配置。您编写的大多数代码并不特定于您选择的加密算法。

下面是一个在 CBC 模式下使用 AES-256 进行加密的简单示例:

#include <stdio.h>
#include <openssl/evp.h>

int main()
{
    EVP_CIPHER_CTX ctx;
    unsigned char key[32] = {0};
    unsigned char iv[16] = {0};
    unsigned char in[16] = {0};
    unsigned char out[32]; /* at least one block longer than in[] */
    int outlen1, outlen2;

    EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv);
    EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in));
    EVP_EncryptFinal(&ctx, out + outlen1, &outlen2);

    printf("ciphertext length: %d\n", outlen1 + outlen2);

    return 0;
}

为简单起见,我省略了错误处理。

IMO 最重要的 OpenSSL 文档之一是Viega/Messier/Chandra 的 OpenSSL 网络安全。它是从 2002 年 (0.9.7) 开始的,因此不包括过去 10 年对 OpenSSL 的更改,但与仅使用手册页相比,IMO 学习 OpenSSL 仍然是一种不那么痛苦的方式。

于 2012-04-28T23:24:03.363 回答
2

目前 OpenSSL wiki 有关于如何使用 EVP 系列函数的良好文档:http ://wiki.openssl.org/index.php/EVP

使用 EVP over algorithm API 的另一个好处是,如果可用,EVP 将自动使用硬件加速(如 AES-NI 指令集)。使用算法 API,您需要手动启用它。

于 2014-09-22T15:48:12.283 回答