OpenSSL aes-128-cfb no produce el tamaño esperado
Intento implementar aes-128-cfb yo mismo para aprender. Para confirmar si mi implementación es correcta, quiero verificarla con una biblioteca conocida como OpenSSL. Pero luego noté algo extraño cuando trato de usar OpenSSL para cifrar.
Tengo archivo cleartext.txt
con el siguiente contenido:
This is cleartext that will be used to encrypt with OpenSSL.
Entonces ejecuto este comando
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
Lo extraño es que el archivo de salida contiene solo 60 bytes. El bloque AES tiene 16 bytes. El tamaño de salida esperado en bytes debe ser múltiplo de 16. 60 no es múltiplo de 16.
¿Me perdí algo importante aquí?
Respuestas
Porque CFB no requiere un relleno similar al modo de operación CTR y OFB. Estos modos crean bloques de cifrado y uno usa la cantidad necesaria de ellos.
En el caso del
openssl enc -K -iv
IV no se escribe en el archivo de salidaoutput.txt
. Por lo tanto, tiene el mismo tamaño que el texto sin formato en bytes;61
bytes cada uno para mi archivo. En este caso, debe manipular la vía intravenosa. Dado que también está proporcionando la vía intravenosa, asegúrese de que no se vuelva a utilizar. De lo contrario, se puede producir un arrastre de cuna en el modo CTR o la reutilización de la clave de OTP.En el caso de
-k/-kfile/-pass
, The IV y Key se derivan del método de derivación de claves mediante el uso de la contraseña del usuario y la sal aleatoria de 8 bytes.OpenSSL primero escribe el archivo mágico de
Salted__
sal de 8 bytes y luego el texto cifrado en el archivo. Ahora el tamaño de salida es tumagic size + salt size + data-size
. En mi sistema,8+8+61 = 77
bytes.Si se utiliza el modo ECB
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
entonces el tamaño es de
80
bytes debido al relleno. ¡Por supuesto, ECB no usa el IV y uno debería olvidar este modo!El modo CBC tiene resultados similares con ECB.
El tamaño de IV derivado puede cambiar de acuerdo con el algoritmo de cifrado utilizado, como el cifrado de bloque de 8 bytes TDES y Blowfish requiere un IV de 8 bytes y los cifrados de bloque de 16 bytes como AES y Twofish requiere un IV de 16 bytes.
Al usar la contraseña, se debe tener cuidado con la entropía de la contraseña y el método de derivación de clave utilizado. Se recomienda utilizar una contraseña de Diceware y al menos PBKDF2 para la derivación de claves. OpenSSL proporciona varios métodos para la derivación de claves