我想使用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
parm设置为AES_ENCRYPT
或AES_DECRYPT
以指定需要执行的操作。
这让我想到了两个问题:
unsigned char *ivec
parm是什么,我从哪里获得?答案 0 :(得分:18)
没有给出大小,因为AES的块大小是固定的,基于密钥大小;您找到了ECB模式实现,不适合直接使用(除了作为教学工具)。
ECB,CBC,CFB128等都是常用modes of operation的简称。它们具有不同的属性,但如果您从未触摸过ECB模式,那么您应该没问题。
我建议远离低级代码;如果可以,请使用EVP_*
接口,并且您可以将其中一些决策移动到文本配置文件中,这样您的用户就可以轻松地在不同的密码,块大小和操作模式之间进行选择。是一个很好的理由改变默认值。
我很同情,OpenSSL文档感觉比实际情况更糟糕,并不是那么好。您可能会发现Network Security with OpenSSL一本有用的书。我希望我最后一次使用OpenSSL时发现它。 (不要让愚蠢的标题欺骗你 - 它应该标题为“OpenSSL”。哦,好吧。)
修改我忘了提及initialization vectors。它们用于确保如果使用相同的密钥加密相同的数据,则密文将不相同。您需要IV来解密数据,但您不需要保密IV。您应该为每个会话随机生成一个(并将其与RSA或El Gamal或DH加密的会话密钥一起发送)或在两个端点上以相同方式生成它,或者将其与文件本地存储在一起,就像这样。