web-dev-qa-db-fra.com

Remplissage AES CBC lorsque la longueur du message est un multiple de la taille du bloc

En supposant qu'un texte en clair de 32 octets est chiffré par AES 128 CBC - est-il obligatoire d'ajouter un remplissage de 16 octets, selon les différents schémas de remplissage?

21
moti

Le remplissage est un moyen de crypter des messages d'une taille que le chiffrement par bloc ne pourrait pas décrypter autrement; c'est une convention entre celui qui crypte et celui qui décrypte. Si vos messages d'entrée ont toujours une longueur qui peut être traitée avec votre mode de cryptage (par exemple, vos messages ont toujours une longueur multiple de 16), vous n'avez pas à ajouter de remplissage - tant que lors du déchiffrement, vous n'essayez pas de rechercher un remplissage lorsqu'il n'y en a pas. Si certains de vos messages nécessitent un remplissage, alors vous devrez ajouter systématiquement une sorte de remplissage, sinon le déchiffrement sera ambigu.

Le rembourrage n'ajoute pas de sécurité. La gestion du padding mal implémenté peut fuir des informations ( oracles de padding ), vous devez donc être prudent avec votre implémentation - de préférence en ne le faire vous-même.

(Bien sûr, vous seriez mieux servi avec un mode de cryptage qui n'a pas besoin de rembourrage et inclut le contrôle d'intégrité bien nécessaire mais très négligé; cela signifie GCM ou EAX , pas CBC.)

21
Thomas Pornin

Tout dépend de ce que vous cryptez. Si vous chiffrez des données qui ont toujours une longueur de 32 octets (ou plusieurs de la taille du bloc), vous n'avez pas du tout besoin d'utiliser de remplissage.

Si le texte brut est de longueur arbitraire, vous devez remplir votre texte et utiliser un mécanisme pour pouvoir séparer les données du remplissage lorsque vous déchiffrez.

Supposons que vous utilisez un schéma de remplissage dans lequel vous remplissez avec 01 si un octet est manquant, avec 02 02 si 2 octets sont manquants et ainsi de suite.

Vous devez également ajouter un remplissage pour le texte de 16 octets car sinon, si vous déchiffrez un texte comme

01 02 03 05 06 01 02 03 05 06 06 01

vous ne pourriez pas savoir s'il s'agissait d'un texte de 15 octets:

01 02 03 05 06 01 02 03 05 06 06 + 01

remplissage d'un texte de 16 octets qui n'a pas été complété:

01 02 03 05 06 01 02 03 05 06 06 01

.

Le problème ci-dessus est résolu en sachant que vous remplissez toujours vos données, quelle que soit la longueur.

7
Dinu

Il n'est pas "obligatoire" d'ajouter un remplissage à un message qui est un multiple de la taille du bloc, mais la plupart des implémentations le font. Le remplissage PKCS # 5 prescrit l'ajout d'un bloc d'octets, tous mis à zéro, pour indiquer à l'algorithme qu'il possède en fait tous les blocs qui ont été transmis. Cela est utile lorsque l'implémentation peut être appelée pour crypter quoi que ce soit, de n'importe quelle longueur, et l'envoyer via une méthode de transport "peu fiable". Lorsque vous utilisez une couche de communication qui possède sa propre vérification d'erreur, telle que TCP, et lorsque vous savez que le message non complété est toujours un multiple exact de la taille de bloc utilisée, il est redondant.

2
KeithS