OpenSSL aes-128-cfb não produz o tamanho esperado

Aug 17 2020

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.txtcom 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

2 kelalaka Aug 17 2020 at 22:02

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 -ivIV não é gravado no arquivo de saída output.txt. Portanto, ele tem o mesmo tamanho que o texto simples em bytes; 61bytes 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 arquivoSalted__ com um sal de 8 bytes e o texto cifrado no arquivo. Agora, o tamanho de saída é seu magic size + salt size + data-size. Em meu sistema, 8+8+61 = 77bytes.

    • Se o modo ECB for usado

      openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
      

    então o tamanho é 80bytes 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