Le chiffrement AES se fait bloc par bloc de taille fixe (en général cette taille est 128 bits soit 16 octets).

Le problème est que cela demande que la taille des données qu'on souhaite chiffrer doit être un multiple de 16 octets.

En pratique c'est jamais le cas..

Par conséquent, le dernier bloc a chiffrer doit être "rempli" afin de faire 16 octets.

Par exemple, si le dernier bloc a chiffrer fait 11 octets, il faut ajouter 5 pour faire 16 en tout.

Ceci est donc le padding.

Il existe plusieurs conventions pour le padding.

- Le Zero Padding : rajouter des 0 a la fin.

Par exemple FF FF FF FF FF FF FF FF FF sont mes données a chiffrer.

Avec le Zero Padding ça donne FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

- Le PKCS#7 : rajouter une séquence d'octets , dont chacun a une valeur égale au nombre total d'octets de remplissage ajoutés.

Avec le PKCS#7 ça donne FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

- Le ISO10126P rajouter des octets aléatoires et en dernier un octet ayant la valeur égale au nombre total d'octets de remplissage ajoutés.

Avec le ISO10126P ça donne FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07 (par exemple)

Le but est donc au déchiffrement de pouvoir reconstituer le dernier bloc exactement comme il était avant le chiffrement.

Mais je me pose des questions... Il existe des cas ou le dernier bloc fait exactement 16 octets et on ne peut pas savoir si un Padding a été utilisé ou pas, et par conséquent ça amènera a déchiffrer un dernier bloc corrompu.

Exemple:

- Avec le Zero Padding:

Si les données a chiffrer sont 7D 2A 75 EF F8 EF 7D 2A 75 EF F8 EF 7D 2A 75 00, au déchiffrement le dernier octet va être retiré.

- Avec le PKCS#7:

Si les données a chiffrer sont 7D 2A 75 EF F8 EF 7D 2A 75 EF F8 EF 7D 2A 75 01, au déchiffrement le dernier octet va être retiré.

ou encore

7D 2A 75 EF F8 EF 7D 2A 75 EF F8 EF 7D 2A 02 02, au déchiffrement les deux derniers octets vont être retirés.

Dans ce Padding, plus le nombre d'octets a remplir augmente, plus la chance de se retrouver dans ce cas diminue.

Cependant, le cas ou juste le dernier octet vaut 01 et l'avant dernier différent de 01 est assez probable... Si on suppose que les valeurs des données sont aléatoire, on a une chance sur 256 (a condition que le dernier bloc soit de taille exacte de 16 octets).

Je suis le seul a trouver que ceci n'est pas très sur ?

Si a la fin on rajouter un bloc de métadonnées qui vaut 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 si un padding a été utilisé ou 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 si le dernier bloc de données a chiffrer avait une taille exacte de 16 octets.

Cette solution garantit l’intégrité des données déchiffrées mais peut être ne garantit plus une sécurité face a une attaque de cryptanalyse.

Quelqu’un peut me répondre ?



Je vous remercie