我想使用 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_ENCRYPT
或 AES_DECRYPT
来指定需要执行哪个操作。
这让我想到了我的两个问题:
- 这些名字的含义是什么?什么是 ecb、cbc、cfb128 等...以及我如何决定应该使用哪一个?
- 其中大多数所需的
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/