Me gustaría utilizar 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.Cómo hacer el descifrado AES con OpenSSL
Fui mirando directamente a /usr/include/openssl/aes.h
ya que el sitio de OpenSSL es ligero en la documentación. La única función de descifrado es éste:
void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
Desafortunadamente, esto no tiene una forma de especificar la longitud del puntero in
, así que no estoy seguro de cómo funcionaría.
Existen varias otras funciones que creo que toman un parm numérico para diferenciar entre el cifrado y el 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);
Por lo que entiendo el uso de Google, la enc
Parm se establece en AES_ENCRYPT
o AES_DECRYPT
para especificar qué acción debe llevarse a cabo.
que me lleva a mis 2 preguntas:
- ¿Qué significan estos nombres? ¿Qué es ecb, cbc, cfb128, etc. ... y cómo decido cuál debería usar?
- ¿Cuál es el parmetro
unsigned char *ivec
necesario para la mayoría de estos, y de dónde lo obtengo?
Debería * no * usar 'AES_encrypt' y sus amigos. Deberías estar usando las funciones 'EVP_ *'. Consulte [EVP Symmetric Encryption and Decryption] (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) en la wiki de OpenSSL.De hecho, probablemente debería estar usando el cifrado autenticado porque proporciona * ambos * confidencialidad y autenticidad. Ver [EVP Authenticated Encryption and Decryption] (https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) en la wiki de OpenSSL. – jww