web-dev-qa-db-fra.com

Taille des données après cryptage AES / CBC et AES / ECB

Je voudrais connaître la taille des données après le cryptage AES afin d'éviter de mettre en mémoire tampon mes données post-AES (sur disque ou mémoire) principalement pour connaître la taille.

J'utilise 128 bits AES et javax.crypto.Cipher et javax.crypto.CipherInputStream pour le chiffrement.

Quelques tests effectués avec différentes tailles d'entrée montrent que la taille de post-cryptage calculée comme ci-dessous est correcte:

long size = input_Size_In_Bytes; 
long post_AES_Size = size + (16 - (size % 16));

Mais je ne sais pas si la formule ci-dessus est applicable à toutes les tailles d'entrée possibles.

Existe-t-il un moyen de calculer la taille des données après avoir appliqué le cryptage AES - à l'avance sans avoir à mettre en mémoire tampon les données cryptées (sur disque ou en mémoire) pour connaître leur taille post-cryptage?

58
Ramson Tutte

AES a une taille de bloc fixe de 16 octets quelle que soit la taille de clé. En supposant que vous utilisez le rembourrage PKCS 5/7, utilisez cette formule,

 cipherLen = (clearLen/16 + 1) * 16;

Veuillez noter que si le texte en clair est multiple de la taille du bloc, un tout nouveau bloc est nécessaire pour le remplissage. Disons que le texte en clair est de 16 octets. Le texte chiffré prendra 32 octets.

Vous voudrez peut-être stocker IV (vecteur initial) avec du texte chiffré. Dans ce cas, vous devez ajouter 16 octets supplémentaires pour IV.

80
ZZ Coder

AES, en tant que chiffre de bloc, ne change pas la taille. La taille d'entrée est toujours la taille de sortie.

Mais AES, étant un chiffrement par bloc, nécessite que l'entrée soit multiple de la taille du bloc (16 octets). Pour cela, les schémas de remplissage sont utilisés comme le populaire PKCS5 . La réponse est donc que la taille de vos données cryptées dépend du schéma de remplissage utilisé. Mais en même temps tous les schémas de remplissage connus arrondiront à la taille suivante du module 16 (la taille AES a une taille de bloc de 16 octets).

31
Remus Rusanu

Cela dépend du mode dans lequel vous utilisez AES. Ce que vous avez est précis pour la plupart des modes orientés bloc, tels que ECB et CBC. OTOH, en mode CFB (pour un exemple), vous utilisez simplement AES pour produire un flux d'octets, que vous XOR avec des octets de l'entrée. Dans ce cas, la taille de la la sortie peut rester la taille de l'entrée plutôt que d'être arrondie à la taille de bloc suivante comme vous l'avez indiqué ci-dessus.

8
Jerry Coffin
5
Zaf

Le chiffrement AES fonctionne toujours sur des blocs de 16 octets (128 bits). Si le nombre d'octets d'entrée n'est pas un multiple exact de 16, il est complété. C'est pourquoi 16 semble être le "nombre magique" dans votre calcul. Ce que vous avez devrait fonctionner pour toutes les tailles d'entrée.

3
In silico

AES fonctionne en blocs de 128 bits (16 octets) et convertit les blocs de texte clair en blocs de chiffrement de même longueur. Il remplit le dernier bloc s'il est inférieur à 16 octets, donc votre formule semble correcte.

1
wRAR

Si votre longueur d'entrée est inférieure à la taille maximale de int, vous pouvez utiliser Cipher.getOutputSize (int)

0
ed22