Si vous avez déjà AES, pourquoi faudrait-il une construction séparée pour chiffrer une clé AES ? La réponse est une bonne leçon sur l’art de lire la motivation d’une spécification plutôt que son algorithme.
Ce qu’une clé a de particulier
Une clé est courte, de forte entropie, et son intégrité compte absolument. La chiffrer avec un mode généraliste amène des problèmes invisibles avec un message :
- Un vecteur d’initialisation à gérer. Donc à ranger, à transmettre, et à ne jamais réemployer. De l’état en plus autour de quelque chose qui devrait être un seul bloc opaque.
- Aucune intégrité, sauf à l’ajouter. CBC ou CTR déchiffreront volontiers un chiffré altéré en une clé différente, et vous l’apprendrez quand une signature échouera pour des raisons que personne ne saura expliquer.
- Une fuite de longueur. Sans objet pour une clé de taille connue, mais le remplissage que vous ajoutez pour atteindre une frontière de bloc est une chose de plus à rater.
Ce que fait Key Wrap à la place
La RFC 3394 définit une construction déterministe sans vecteur d’initialisation et à intégrité intégrée. Elle emploie une valeur initiale fixe ; si la désencapsulation ne la produit pas, la clé encapsulée a été altérée et l’opération échoue.
Le déterminisme est l’intérêt. La même clé encapsulée avec la même clé d’encapsulation donne la même sortie à chaque fois, propriété que vous voulez pour comparer ou dédupliquer, et qui est exactement ce qu’il ne faut jamais faire à un message.
La RFC 5649 l’étend aux clés dont la longueur n’est pas un multiple de huit octets, ce qui la rend utilisable en pratique.
Où vous la rencontrez
Dans JWE, sous les noms A128KW, A192KW et A256KW. La clé de chiffrement de contenu du jeton est encapsulée avec une clé que vous partagez avec le destinataire, et le résultat est le deuxième segment du jeton. L’article sur JWE couvre la structure alentour.
aes-key-wrap implémente les deux RFC en PHP pur.
La leçon générale
Quand une spécification existe pour une tâche que vous pourriez accomplir avec un outil généraliste, la question intéressante n’est pas « est-ce équivalent » mais « de quoi avaient-ils besoin que l’outil généraliste ne donnait pas ». Ici c’était : pas de vecteur d’initialisation à mal manipuler, et un échec à l’altération plutôt qu’une mauvaise clé rendue en silence.