c++ - 如何使用 OpenSSL 进行 AES 解密

标签 c++ c openssl aes encryption

我想使用 OpenSSL 库来解密一些 AES 数据。该代码可以访问 key 。这个项目已经使用 libopenssl 来做其他事情,所以我想坚持使用这个库。

我直接查看了 /usr/include/openssl/aes.h 因为 OpenSSL 站点的文档很少。唯一的解密函数是这个:

void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);

不幸的是,这没有办法指定 in 指针的长度,所以我不确定它是如何工作的。

我认为还有其他几个函数需要数字参数来区分加密和解密。例如:

void AES_ecb_encrypt(*in, *out, *key, enc);
void AES_cbc_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_cfb128_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb1_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb8_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfbr_encrypt_block(*in, *out, nbits, *key, *ivec, enc);
void AES_ofb128_encrypt(*in, *out, length, *key, *ivec, *num);
void AES_ctr128_encrypt(*in, *out, length, *key, ivec[], ecount_buf[], *num);
void AES_ige_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_bi_ige_encrypt(*in, *out, length, *key, *key2, *ivec, enc);

根据我对 Google 的了解,enc 参数设置为 AES_ENCRYPTAES_DECRYPT 来指定需要执行哪个操作。

这让我想到了我的两个问题:

  1. 这些名字的含义是什么?什么是 ecb、cbc、cfb128 等...以及我如何决定应该使用哪一个?
  2. 其中大多数所需的 unsigned char *ivec 参数是什么?从哪里获取它?

最佳答案

没有给出大小,因为 AES 的 block 大小是固定的基于 key 大小;您已找到ECB模式实现,不适合直接使用(作为教学工具除外)。

ECB、CBC、CFB128 等都是 modes of operation 的简称。那些常用的。它们具有不同的属性,但如果您从未接触过 ECB 模式,应该没问题。

我建议远离底层代码;使用EVP_*如果可以的话,您可以将其中一些决策移至文本配置文件中,以便您的用户可以轻松地在不同的密码、 block 大小和操作模式之间进行选择(如果有充分的理由改变的话)从默认值。

我很同情,OpenSSL 文档感觉比实际情况更糟糕,而且也不是那么好。您可能会发现Network Security with OpenSSL一本有用的书。我希望上次需要使用 OpenSSL 时能早点找到它。 (不要让这个愚蠢的标题欺骗了您 - 它应该标题只是“OpenSSL”。哦,好吧。)

编辑我忘了提及 initialization vectors 。它们用于确保如果您使用相同的 key 加密相同的数据,密文不会相同。您需要 IV 来解密数据,但不需要对 IV 保密。您应该为每个 session 随机生成一个(并将其与 RSA 或 El Gamal 或 DH 加密的 session key 一起发送),或者在两个端点上以相同的方式生成它,或者将其与文件一起存储在本地,类似这样。

关于c++ - 如何使用 OpenSSL 进行 AES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555627/

相关文章:

c++ - strcpy 和其他 C 库函数在哪里定义(而不是声明)?

cryptography - 将PBKDF2与OpenSSL库一起使用

ruby - 无法与 ruby​​ 建立 https 连接

C++:如何将字符串中的每个字符转换为相应的字符?

C++ 模板、多态性和模板协变

c++ - OpenGL glDrawElements 只有黑屏

c - 串行编程 : measuring time between characters

在 for 循环中调用 fork()

c++ - 我应该如何更正此 priority_queue 比较功能?

r - 在 Zscaler 防火墙后面的 Docker 镜像中发出 HTTPS 请求