5. Objets de Chiffrement
- Objets de Chiffrement
COSE prend en charge deux structures de chiffrement différentes. COSE_Encrypt0 est utilisé lorsqu'une structure de destinataire n'est pas nécessaire car la clé à utiliser est connue implicitement. COSE_Encrypt est utilisé le reste du temps. Cela inclut les cas où il y a plusieurs destinataires ou un algorithme de destinataire autre que direct (c'est-à-dire, secret pré-partagé) est utilisé.
5.1. Structure COSE Enveloppée
La structure enveloppée permet un ou plusieurs destinataires d'un message. Il existe des dispositions pour que les paramètres d'en-tête concernant le contenu et les paramètres d'en-tête concernant les informations du destinataire soient transportés dans le message. Les paramètres d'en-tête protégés associés au contenu sont authentifiés par l'algorithme de chiffrement du contenu. Les paramètres d'en-tête protégés associés au destinataire (lorsque l'algorithme le prend en charge) sont authentifiés par l'algorithme du destinataire. Des exemples de paramètres d'en-tête concernant le contenu sont le type de contenu et l'algorithme de chiffrement du contenu. Des exemples de paramètres d'en-tête concernant le destinataire sont l'identifiant de clé du destinataire et l'algorithme de chiffrement du destinataire.
Les mêmes techniques et presque la même structure sont utilisées pour chiffrer à la fois le texte clair et les clés. Cela diffère de l'approche utilisée à la fois par "Cryptographic Message Syntax (CMS)" [RFC5652] et "JSON Web Encryption (JWE)" [RFC7516], où des structures différentes sont utilisées pour la couche de contenu et la couche de destinataire. Deux structures sont définies : COSE_Encrypt pour contenir le contenu chiffré et COSE_recipient pour contenir les clés chiffrées pour les destinataires. Des exemples de messages enveloppés peuvent être trouvés dans l'annexe C.3.
La structure COSE_Encrypt peut être encodée comme marquée ou non marquée, selon le contexte dans lequel elle sera utilisée. Une structure COSE_Encrypt marquée est identifiée par l'étiquette CBOR 96. Le fragment CDDL qui représente ceci est :
COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)
La structure COSE_Encrypt est un tableau CBOR. Les champs du tableau, dans l'ordre, sont :
protected (protégé) : Ceci est tel que décrit dans la section 3.
unprotected (non protégé) : Ceci est tel que décrit dans la section 3.
ciphertext (texte chiffré) : Ce champ contient le texte chiffré, encodé comme une bstr. Si le texte chiffré doit être transporté indépendamment des informations de contrôle sur le processus de chiffrement (c'est-à-dire, contenu détaché), alors le champ est encodé comme une valeur nil.
recipients (destinataires) : Ce champ contient un tableau de structures d'informations sur les destinataires. Le type pour la structure d'informations sur le destinataire est un COSE_recipient.
Le fragment CDDL qui correspond au texte ci-dessus est :
COSE_Encrypt = [ Headers, ciphertext : bstr / nil, recipients : [+COSE_recipient] ]
La structure COSE_recipient est un tableau CBOR. Les champs du tableau, dans l'ordre, sont :
protected (protégé) : Ceci est tel que décrit dans la section 3.
unprotected (non protégé) : Ceci est tel que décrit dans la section 3.
ciphertext (texte chiffré) : Ce champ contient la clé chiffrée, encodée comme une bstr. Toutes les clés encodées sont des clés symétriques ; la valeur binaire de la clé est le contenu. S'il n'y a pas de clé chiffrée, alors ce champ est encodé comme une valeur nil.
recipients (destinataires) : Ce champ contient un tableau de structures d'informations sur les destinataires. Le type pour la structure d'informations sur le destinataire est un COSE_recipient (un exemple de cela peut être trouvé dans l'annexe B). S'il n'y a pas de structures d'informations sur les destinataires, cet élément est absent.
Le fragment CDDL qui correspond au texte ci-dessus pour COSE_recipient est :
COSE_recipient = [ Headers, ciphertext : bstr / nil, ? recipients : [+COSE_recipient] ]
5.1.1. Méthodes de distribution de clés de contenu
Un message chiffré consiste en un contenu chiffré et une CEK chiffrée pour un ou plusieurs destinataires. La CEK est chiffrée pour chaque destinataire, en utilisant une clé spécifique à ce destinataire. Les détails de ce chiffrement dépendent de la classe dans laquelle tombe l'algorithme du destinataire. Des détails spécifiques sur chacune des classes peuvent être trouvés dans la section 8.5. Un bref résumé des cinq méthodes de distribution de clés de contenu est :
direct (direct) : La CEK est la même que la clé symétrique précédemment distribuée identifiée ou est dérivée d'un secret précédemment distribué. Aucune CEK n'est transportée dans le message.
symmetric key-encryption keys (KEKs) (clés de chiffrement de clé symétriques) : La CEK est chiffrée en utilisant une KEK symétrique précédemment distribuée. Aussi connu sous le nom d'enveloppement de clé (key wrap).
key agreement (accord de clé) : La clé publique du destinataire et la clé privée de l'expéditeur sont utilisées pour générer un secret par paire, une fonction de dérivation de clé (KDF) est appliquée pour dériver une clé, et ensuite la CEK est soit la clé dérivée, soit chiffrée par la clé dérivée.
key transport (transport de clé) : La CEK est chiffrée avec la clé publique du destinataire.
passwords (mots de passe) : La CEK est chiffrée dans une KEK qui est dérivée d'un mot de passe. Au moment de la publication de ce document, aucun algorithme de mot de passe n'a été défini.
5.2. Chiffrement à destinataire unique
La structure chiffrée COSE_Encrypt0 n'a pas la capacité de spécifier les destinataires du message. La structure suppose que le destinataire de l'objet connaîtra déjà l'identité de la clé à utiliser afin de déchiffrer le message. Si une clé doit être identifiée au destinataire, la structure enveloppée devrait être utilisée.
Des exemples de messages chiffrés peuvent être trouvés dans l'annexe C.4.
La structure COSE_Encrypt0 peut être encodée comme marquée ou non marquée, selon le contexte dans lequel elle sera utilisée. Une structure COSE_Encrypt0 marquée est identifiée par l'étiquette CBOR 16. Le fragment CDDL qui représente ceci est :
COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)
La structure COSE_Encrypt0 est un tableau CBOR. Les champs du tableau, dans l'ordre, sont :
protected (protégé) : Ceci est tel que décrit dans la section 3.
unprotected (non protégé) : Ceci est tel que décrit dans la section 3.
ciphertext (texte chiffré) : Ceci est tel que décrit dans la section 5.1.
Le fragment CDDL pour COSE_Encrypt0 qui correspond au texte ci-dessus est :
COSE_Encrypt0 = [ Headers, ciphertext : bstr / nil, ]
5.3. Comment chiffrer et déchiffrer pour les algorithmes AEAD
L'algorithme de chiffrement pour les algorithmes AEAD est assez simple. La première étape consiste à créer une chaîne d'octets cohérente pour la structure de données authentifiées. À cette fin, nous utilisons une Enc_structure. L'Enc_structure est un tableau CBOR. Les champs de l'Enc_structure, dans l'ordre, sont :
-
Une chaîne de texte de contexte identifiant le contexte de la structure de données authentifiées. La chaîne de texte de contexte est :
"Encrypt0" pour le chiffrement de contenu d'une structure de données COSE_Encrypt0.
"Encrypt" pour la première couche d'une structure de données COSE_Encrypt (c'est-à-dire, pour le chiffrement de contenu).
"Enc_Recipient" pour un encodage de destinataire à placer dans une structure de données COSE_Encrypt.
"Mac_Recipient" pour un encodage de destinataire à placer dans une structure de message MACed.
"Rec_Recipient" pour un encodage de destinataire à placer dans une structure de destinataire.
-
Les attributs protégés de la structure du corps, encodés dans un type bstr. S'il n'y a pas d'attributs protégés, une chaîne d'octets de longueur nulle est utilisée.
-
Les données fournies de manière externe par l'application encodées dans un type bstr. Si ce champ n'est pas fourni, il prend par défaut une chaîne d'octets de longueur nulle. (Voir la section 4.3 pour les conseils d'application sur la construction de ce champ.)
Le fragment CDDL qui décrit le texte ci-dessus est :
Enc_structure = [ context : "Encrypt" / "Encrypt0" / "Enc_Recipient" / "Mac_Recipient" / "Rec_Recipient", protected : empty_or_serialized_map, external_aad : bstr ]
Comment chiffrer un message :
-
Créer une Enc_structure et la remplir avec les champs appropriés.
-
Encoder l'Enc_structure en une chaîne d'octets (Données Authentifiées Supplémentaires (AAD)), en utilisant l'encodage décrit dans la section 9.
-
Déterminer la clé de chiffrement (K). Cette étape dépend de la classe d'algorithme de destinataire utilisée. Pour :
No Recipients (Aucun destinataire) : La clé à utiliser est déterminée par l'algorithme et la clé à la couche actuelle. Des exemples sont les clés d'enveloppement de clé (Section 8.5.2) et les secrets pré-partagés.
Direct Encryption and Direct Key Agreement (Chiffrement direct et accord de clé direct) : La clé est déterminée par la clé et l'algorithme dans la structure du destinataire. L'algorithme de chiffrement et la taille de la clé à utiliser sont des entrées dans la KDF utilisée pour le destinataire. (Pour direct, la KDF peut être considérée comme l'opération d'identité.) Des exemples de ces algorithmes se trouvent dans les sections 6.1 et 6.3 de [RFC9053].
Other (Autre) : La clé est générée aléatoirement.
-
Appeler l'algorithme de chiffrement avec K (la clé de chiffrement), P (le texte clair) et AAD. Placer le texte chiffré retourné dans le champ "ciphertext" de la structure.
-
Pour les destinataires du message utilisant des algorithmes non directs, effectuer récursivement l'algorithme de chiffrement pour ce destinataire, en utilisant K (la clé de chiffrement) comme texte clair.
Comment déchiffrer un message :
-
Créer une Enc_structure et la remplir avec les champs appropriés.
-
Encoder l'Enc_structure en une chaîne d'octets (AAD), en utilisant l'encodage décrit dans la section 9.
-
Déterminer la clé de déchiffrement. Cette étape dépend de la classe d'algorithme de destinataire utilisée. Pour :
No Recipients (Aucun destinataire) : La clé à utiliser est déterminée par l'algorithme et la clé à la couche actuelle. Des exemples sont les clés d'enveloppement de clé (Section 8.5.2) et les secrets pré-partagés.
Direct Encryption and Direct Key Agreement (Chiffrement direct et accord de clé direct) : La clé est déterminée par la clé et l'algorithme dans la structure du destinataire. L'algorithme de chiffrement et la taille de la clé à utiliser sont des entrées dans la KDF utilisée pour le destinataire. (Pour direct, la KDF peut être considérée comme l'opération d'identité.)
Other (Autre) : La clé est déterminée en décodant et en déchiffrant l'une des structures de destinataire.
-
Appeler l'algorithme de déchiffrement avec K (la clé de déchiffrement à utiliser), C (le texte chiffré) et AAD.
5.4. Comment chiffrer et déchiffrer pour les algorithmes AE
Comment chiffrer un message :
-
Vérifier que le champ "protected" est une chaîne d'octets de longueur nulle.
-
Vérifier qu'il n'y a pas eu de données authentifiées supplémentaires externes fournies pour cette opération.
-
Déterminer la clé de chiffrement. Cette étape dépend de la classe d'algorithme de destinataire utilisée. Pour :
No Recipients (Aucun destinataire) : La clé à utiliser est déterminée par l'algorithme et la clé à la couche actuelle. Des exemples sont les clés d'enveloppement de clé (Section 8.5.2) et les secrets pré-partagés.
Direct Encryption and Direct Key Agreement (Chiffrement direct et accord de clé direct) : La clé est déterminée par la clé et l'algorithme dans la structure du destinataire. L'algorithme de chiffrement et la taille de la clé à utiliser sont des entrées dans la KDF utilisée pour le destinataire. (Pour direct, la KDF peut être considérée comme l'opération d'identité.) Des exemples de ces algorithmes se trouvent dans les sections 6.1 et 6.3 de [RFC9053].
Other (Autre) : La clé est générée aléatoirement.
-
Appeler l'algorithme de chiffrement avec K (la clé de chiffrement à utiliser) et P (le texte clair). Placer le texte chiffré retourné dans le champ "ciphertext" de la structure.
-
Pour les destinataires du message utilisant des algorithmes non directs, effectuer récursivement l'algorithme de chiffrement pour ce destinataire, en utilisant K (la clé de chiffrement) comme texte clair.
Comment déchiffrer un message :
-
Vérifier que le champ "protected" est une chaîne d'octets de longueur nulle.
-
Vérifier qu'il n'y a pas eu de données authentifiées supplémentaires externes fournies pour cette opération.
-
Déterminer la clé de déchiffrement. Cette étape dépend de la classe d'algorithme de destinataire utilisée. Pour :
No Recipients (Aucun destinataire) : La clé à utiliser est déterminée par l'algorithme et la clé à la couche actuelle. Des exemples sont les clés d'enveloppement de clé (Section 8.5.2) et les secrets pré-partagés.
Direct Encryption and Direct Key Agreement (Chiffrement direct et accord de clé direct) : La clé est déterminée par la clé et l'algorithme dans la structure du destinataire. L'algorithme de chiffrement et la taille de la clé à utiliser sont des entrées dans la KDF utilisée pour le destinataire. (Pour direct, la KDF peut être considérée comme l'opération d'identité.) Des exemples de ces algorithmes se trouvent dans les sections 6.1 et 6.3 de [RFC9053].
Other (Autre) : La clé est déterminée en décodant et en déchiffrant l'une des structures de destinataire.
-
Appeler l'algorithme de déchiffrement avec K (la clé de déchiffrement à utiliser) et C (le texte chiffré).