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?