如何使用OpenSSL进行AES解密

我想使用OpenSSL库来解密一些AES数据。 代码可以访问密钥。 这个项目已经将libopenssl用于其他方面了,所以我想坚持使用这个库。

我直接查看了/usr/include/openssl/aes.h因为OpenSSL网站对文档很轻松。 唯一的解密function就是这个:

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

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

我认为还有其他一些function可以用数字参数来区分加密和解密。 例如:

 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_ENCRYPTAES_DECRYPT以指定需要执行的操作。

这让我想到了两个问题:

  1. 这些名字是什么意思? 什么是ecb,cbc,cfb128等…,我如何决定应该使用哪一个?
  2. 什么是大多数这些需要的unsigned char *ivec parm,我从哪里获得它?

由于AES的块大小是根据密钥大小固定的,因此没有给出大小 ; 你已经找到了ECB模式实现,它不适合直接使用(除了作为教学工具)。

ECB,CBC,CFB128等都是常用的操作模式的简称。 它们具有不同的属性,但如果您从未触摸过ECB模式,那么您应该没问题。

我建议远离低级代码; 如果可以,请使用EVP_*接口,并且您可以将其中一些决策移动到文本配置文件中,这样您的用户就可以轻松地在不同的密码,块大小和操作模式之间进行选择(如果有的话)有理由改变默认值。

我的同情心,OpenSSL文档感觉比现在更糟糕,而且它并不是那么好。 您可能会发现使用OpenSSL的Network Security是一本有用的书。 我希望我最后一次使用OpenSSL时发现它。 (不要让这个愚蠢的标题欺骗你 – 它应该只是标题为“OpenSSL”。哦。好吧。)

编辑我忘了提到初始化向量 。 它们用于确保如果使用相同的密钥加密相同的数据,则密文将不相同。 您需要IV来解密数据,但您不需要保密IV。 您应该为每个会话随机生成一个(并将其与RSA或El Gamal或DH加密的会话密钥一起发送)或在两个端点上相同地生成它,或者将其与文件本地存储在一起,就像这样。