Remplissage (cryptographie)
En cryptographie, le remplissage ou bourrage (padding) consiste à faire en sorte que la taille des données soit compatible avec les algorithmes utilisés. Un grand nombre de schémas cryptographiques décrivent des algorithmes qui utilisent un partitionnement en blocs de taille fixe. Si la taille des données n'est pas un multiple de la taille d'un bloc alors l’utilisation d’un schéma de remplissage doit être envisagé.
Historiquement, le remplissage était utile pour contrer la cryptanalyse. Plusieurs algorithmes classiques placent le texte en clair dans des grilles rectangulaires ou carrées. Il faut dès lors remplir les cases manquantes et on utilise pour cela du texte aléatoire destiné à rendre l'analyse plus pénible.
En cryptographie moderne, le remplissage apparaît dans plusieurs primitives et concepts :
- chiffrement par bloc : le remplissage permet d'avoir un bloc de la taille adéquate si celui-ci est trop court (par exemple en ajoutant des 0) ;
- chiffrement par flot : le remplissage peut éviter d'avoir une longueur par flot susceptible d'être attaquée, cela évite aussi que l'attaquant ne connaisse la taille du flux ;
- cryptographie asymétrique : les cryptosystèmes prennent en entrée des données qui ne sont pas nécessairement des chaînes de bits, par exemple pour le chiffrement RSA, le message à chiffrer est un entier modulaire devant vérifiant des propriétés supplémentaires afin de résister à certaines attaques[1]. Lors de l’encodage du message réel (sous la forme une chaîne de bits) dans l’ensemble voulu (pour RSA un entier modulaire), un remplissage est effectué pour garantir que l’entrée n’est pas vulnérable aux attaques ;
- fonction de hachage : la plupart des fonctions découpent les données en blocs de taille fixe et le dernier bloc doit être rempli de manière adéquate.
Le remplissage doit suivre certaines contraintes pour éviter des attaques. Dans le cadre des fonctions de hachage, on peut appliquer un renforcement de Merkle-Damgård qui consiste à ajouter un 1, une suite de 0 et finalement la taille du message à hacher. Si l'on se contentait d'ajouter uniquement des 0, les messages "000" et "0000" produiraient le même condensé ce qui est totalement incompatible avec la notion de résistance à la préimage des fonctions de hachage cryptographique.
Le standard PKCS définit des remplissages qui évitent des attaques potentielles dans le cadre de la cryptographie asymétrique[2].
Notes et références
- Par exemple si (dans ℤ), le calcul direct de la racine e-ième dans ℤ suffit à retrouver le message.
- (en) « PKCS #1: RSA Cryptography Specifications », Request for comments no 2437.