OpenSSL aes-128-cfb não produz o tamanho esperado
Tento implementar aes-128-cfb sozinho para aprendizado. Para confirmar se minha implementação está correta, quero verificá-la com uma biblioteca conhecida, como OpenSSL. Mas então percebi algo estranho quando tento usar o OpenSSL para criptografar.
Tenho arquivo cleartext.txt
com o seguinte conteúdo:
This is cleartext that will be used to encrypt with OpenSSL.
Então eu executo este comando
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
O estranho é que o arquivo de saída contém apenas 60 bytes. O bloco AES tem 16 bytes. O tamanho de saída esperado em byte deve ser múltiplo de 16. 60 não é múltiplo de 16.
Eu perdi algo importante aqui?
Respostas
Porque CFB não requer preenchimento semelhante ao modo de operação CTR e OFB. Esses modos criam blocos de criptografia e um deles usa a quantidade necessária.
No caso do
openssl enc -K -iv
IV não é gravado no arquivo de saídaoutput.txt
. Portanto, ele tem o mesmo tamanho que o texto simples em bytes;61
bytes cada para meu arquivo. Neste caso, você deve lidar com o IV. Como você também está fornecendo o IV, certifique-se de que ele não seja usado novamente. Caso contrário, pode ocorrer um arrastamento do berço no modo CTR ou reutilização da chave OTP.No caso de
-k/-kfile/-pass
, o IV e a chave são derivados do método de derivação de chave usando a senha do usuário e o sal aleatório de 8 bytes.O OpenSSL primeiro grava a magia do arquivo
Salted__
com um sal de 8 bytes e o texto cifrado no arquivo. Agora, o tamanho de saída é seumagic size + salt size + data-size
. Em meu sistema,8+8+61 = 77
bytes.Se o modo ECB for usado
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
então o tamanho é
80
bytes devido ao preenchimento. Claro, ECB não usa o IV e deve-se esquecer esse modo!O modo CBC tem resultados semelhantes com o ECB.
O tamanho IV derivado pode mudar de acordo com algoritmo de criptografia usado como a cifra de bloco de 8 bytes TDES e Blowfish requer 8 bytes IV e cifras de bloco de 16 bytes como AES e Twofish requer 16 bytes IV.
Ao usar a senha, deve-se ter cuidado com a entropia da senha e o método de derivação da chave usada. Usar uma senha Diceware é recomendado e pelo menos PBKDF2 para a derivação da chave. OpenSSL fornece vários métodos para derivação de chave