【发布时间】:2011-07-05 05:06:37
【问题描述】:
我想使用 OpenSSL 库来解密一些 AES 数据。代码可以访问密钥。这个项目已经将 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_encrypt和朋友。您应该使用EVP_*函数。请参阅 OpenSSL wiki 上的 EVP Symmetric Encryption and Decryption。事实上,您可能应该使用经过身份验证的加密,因为它提供 机密性和真实性。请参阅 OpenSSL wiki 上的 EVP Authenticated Encryption and Decryption。
标签: c++ c openssl aes encryption