Cómo hacer descifrado AES usando OpenSSL

Me gustaría usar la biblioteca OpenSSL para descifrar algunos datos AES. El código tiene acceso a la clave. Este proyecto ya usa libopenssl para otra cosa, así que me gustaría seguir con esta biblioteca.

Fui mirando directamente a/usr/include/openssl/aes.h ya que el sitio de OpenSSL tiene poca documentación. La única función de descifrado es esta:

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

esafortunadamente, esto no tiene forma de especificar la longitud dein puntero, así que no estoy seguro de cómo funcionaría eso.

Hay varias otras funciones que creo que toman un parámetro numérico para diferenciar entre cifrado y descifrado. Por ejemplo

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);

De lo que entiendo usando Google, laenc parm se establece enAES_ENCRYPT oAES_DECRYPT para especificar qué acción debe llevarse a cabo.

Lo que me lleva a mis 2 preguntas:

¿Qué significan estos nombres? ¿Qué es ecb, cbc, cfb128, etc., y cómo decido cuál debo usar?Cuál es elunsigned char *ivec parm es necesario para la mayoría de estos, y ¿de dónde lo obtengo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta