9. Implémentation du remplissage PKCS#7

9. Implémentation du remplissage PKCS#7

Implement PKCS#7 padding

A block cipher transforms a fixed-sized block (usually 8 or 16 bytes) of plaintext into ciphertext. But we almost never want to transform a single block; we encrypt irregularly-sized messages.
One way we account for irregularly-sized messages is by padding, creating a plaintext that is an even multiple of the blocksize. The most popular padding scheme is called PKCS#7.
So: pad any block to a specific block length, by appending the number of bytes of padding to the end of the block. For instance,
"YELLOW SUBMARINE"
... padded to 20 bytes would be:
"YELLOW SUBMARINE\x04\x04\x04\x04"

Remarque: La traduction du terme "padding" en français peut, dans un contexte de cryptographie se traduire par "remplissage" ou "bourrage". Les deux termes sont affreux, mais le terme "remplissage" me semblait le plus adapter pour éviter de faire un anglicisme.

Comme expliqué dans l'énoncé, le but de ce problème est de créer une fonction permettant de réaliser un remplissage cryptographique, nécessaire à PKCS#7 (Public-Key Cryptography Standards).

De manière simple, l'idée est que si l'on veut générer des blocs d'une taille fixe il faut que le le texte à chiffrer fasse exactement n fois la taille d'un bloc. Si ce n'est pas le cas, on "arrondira" la longueur de notre texte en rajoutant des caractères à la fin jusqu'à atteindre une longueur qui soit exactement multiple de notre taille de bloc.

L'exemple montré dans l'énonce présente une chaîne de 16 caractères, YELLOW SUBMARINE, pour une taille de bloc de 20 caractères. Il faut donc rajouter 20 - 16 = 4 caractères \x04 correspondant à la différence.

On notera que la convention pour faire la différence entre les caractère qui font partie du texte et ce qui correspond au "remplissage" lors du déchiffrement est symbolisé par le fait que l'octet utilisé pour le remplissage contient la longueur de celui-ci. Par exemple si il convenait de rajouter 7 caractères on aurait utilisé le remplissage \x07

def padding(bytes_string, block_length=16):
    if len(bytes_string) == block_length:
        return bytes_string
    else:
        padding_length = block_length - (len(bytes_string) % block_length)
        return bytes_string+(bytes([padding_length])*padding_length)

text = b"YELLOW SUBMARINE"
block_length = 20
print(padding(text, block_length))

En exécutant le script on obtient bien YELLOW SUBMARINE\x04\x04\x04\x04.