使用 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 仍然是一种不那么痛苦的方式。