5. Oggetti di Crittografia
- Oggetti di Crittografia
COSE supporta due diverse strutture di crittografia. COSE_Encrypt0 viene utilizzato quando non è necessaria una struttura di destinatari perché la chiave da utilizzare è implicitamente nota. COSE_Encrypt viene utilizzato negli altri casi. Ciò include i casi in cui ci sono più destinatari o viene utilizzato un algoritmo per i destinatari che non è diretto (cioè, segreto pre-condiviso).
5.1. Struttura COSE Avvolta
La struttura avvolta consente uno o più destinatari di un messaggio. Sono previsti parametri di intestazione riguardanti il contenuto e parametri di intestazione riguardanti le informazioni del destinatario da trasportare nel messaggio. I parametri di intestazione protetti associati al contenuto sono autenticati dall'algoritmo di crittografia del contenuto. I parametri di intestazione protetti associati al destinatario (quando l'algoritmo lo supporta) sono autenticati dall'algoritmo del destinatario. Esempi di parametri di intestazione riguardanti il contenuto sono il tipo di contenuto e l'algoritmo di crittografia del contenuto. Esempi di parametri di intestazione riguardanti il destinatario sono l'identificatore della chiave del destinatario e l'algoritmo di crittografia del destinatario.
Le stesse tecniche e quasi la stessa struttura sono utilizzate per crittografare sia il testo in chiaro che le chiavi. Questo differisce dall'approccio utilizzato sia da "Cryptographic Message Syntax (CMS)" [RFC5652] che da "JSON Web Encryption (JWE)" [RFC7516], dove vengono utilizzate strutture diverse per il livello del contenuto e il livello del destinatario. Sono definite due strutture: COSE_Encrypt per contenere il contenuto crittografato e COSE_recipient per contenere le chiavi crittografate per i destinatari. Esempi di messaggi avvolti possono essere trovati nell'Appendice C.3.
La struttura COSE_Encrypt può essere codificata come etichettata o non etichettata, a seconda del contesto in cui verrà utilizzata. Una struttura COSE_Encrypt etichettata è identificata dall'etichetta CBOR 96. Il frammento CDDL che rappresenta questo è:
COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)
La struttura COSE_Encrypt è un array CBOR. I campi dell'array, in ordine, sono:
protected (protetto): Questo è come descritto nella Sezione 3.
unprotected (non protetto): Questo è come descritto nella Sezione 3.
ciphertext (testo cifrato): Questo campo contiene il testo cifrato, codificato come bstr. Se il testo cifrato deve essere trasportato indipendentemente dalle informazioni di controllo sul processo di crittografia (cioè, contenuto distaccato), allora il campo è codificato come valore nil.
recipients (destinatari): Questo campo contiene un array di strutture di informazioni sui destinatari. Il tipo per la struttura delle informazioni sul destinatario è un COSE_recipient.
Il frammento CDDL che corrisponde al testo sopra è:
COSE_Encrypt = [ Headers, ciphertext : bstr / nil, recipients : [+COSE_recipient] ]
La struttura COSE_recipient è un array CBOR. I campi dell'array, in ordine, sono:
protected (protetto): Questo è come descritto nella Sezione 3.
unprotected (non protetto): Questo è come descritto nella Sezione 3.
ciphertext (testo cifrato): Questo campo contiene la chiave crittografata, codificata come bstr. Tutte le chiavi codificate sono chiavi simmetriche; il valore binario della chiave è il contenuto. Se non c'è una chiave crittografata, allora questo campo è codificato come valore nil.
recipients (destinatari): Questo campo contiene un array di strutture di informazioni sui destinatari. Il tipo per la struttura delle informazioni sul destinatario è un COSE_recipient (un esempio di questo può essere trovato nell'Appendice B). Se non ci sono strutture di informazioni sui destinatari, questo elemento è assente.
Il frammento CDDL che corrisponde al testo sopra per COSE_recipient è:
COSE_recipient = [ Headers, ciphertext : bstr / nil, ? recipients : [+COSE_recipient] ]
5.1.1. Metodi di Distribuzione delle Chiavi di Contenuto
Un messaggio crittografato consiste in contenuto crittografato e una CEK crittografata per uno o più destinatari. La CEK è crittografata per ogni destinatario, utilizzando una chiave specifica per quel destinatario. I dettagli di questa crittografia dipendono dalla classe in cui rientra l'algoritmo del destinatario. Dettagli specifici su ciascuna delle classi possono essere trovati nella Sezione 8.5. Un breve riassunto dei cinque metodi di distribuzione delle chiavi di contenuto è:
direct (diretto): La CEK è la stessa della chiave simmetrica precedentemente distribuita identificata o è derivata da un segreto precedentemente distribuito. Nessuna CEK viene trasportata nel messaggio.
symmetric key-encryption keys (KEKs) (chiavi di crittografia della chiave simmetriche): La CEK è crittografata utilizzando una KEK simmetrica precedentemente distribuita. Conosciuto anche come key wrap.
key agreement (accordo chiave): La chiave pubblica del destinatario e la chiave privata del mittente sono utilizzate per generare un segreto a coppie, viene applicata una funzione di derivazione della chiave (KDF) per derivare una chiave, e quindi la CEK è la chiave derivata o crittografata dalla chiave derivata.
key transport (trasporto chiave): La CEK è crittografata con la chiave pubblica del destinatario.
passwords (password): La CEK è crittografata in una KEK derivata da una password. Al momento della pubblicazione di questo documento, non sono stati definiti algoritmi di password.
5.2. Crittografia a Destinatario Singolo
La struttura crittografata COSE_Encrypt0 non ha la capacità di specificare i destinatari del messaggio. La struttura presume che il destinatario dell'oggetto conoscerà già l'identità della chiave da utilizzare per decifrare il messaggio. Se una chiave deve essere identificata al destinatario, dovrebbe essere utilizzata la struttura avvolta.
Esempi di messaggi crittografati possono essere trovati nell'Appendice C.4.
La struttura COSE_Encrypt0 può essere codificata come etichettata o non etichettata, a seconda del contesto in cui verrà utilizzata. Una struttura COSE_Encrypt0 etichettata è identificata dall'etichetta CBOR 16. Il frammento CDDL che rappresenta questo è:
COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)
La struttura COSE_Encrypt0 è un array CBOR. I campi dell'array, in ordine, sono:
protected (protetto): Questo è come descritto nella Sezione 3.
unprotected (non protetto): Questo è come descritto nella Sezione 3.
ciphertext (testo cifrato): Questo è come descritto nella Sezione 5.1.
Il frammento CDDL per COSE_Encrypt0 che corrisponde al testo sopra è:
COSE_Encrypt0 = [ Headers, ciphertext : bstr / nil, ]
5.3. Come crittografare e decifrare per algoritmi AEAD
L'algoritmo di crittografia per gli algoritmi AEAD è abbastanza semplice. Il primo passo è creare una stringa di byte coerente per la struttura dei dati autenticati. A tale scopo, utilizziamo una Enc_structure. La Enc_structure è un array CBOR. I campi della Enc_structure, in ordine, sono:
-
Una stringa di testo di contesto che identifica il contesto della struttura dei dati autenticati. La stringa di testo di contesto è:
"Encrypt0" per la crittografia del contenuto di una struttura dati COSE_Encrypt0.
"Encrypt" per il primo livello di una struttura dati COSE_Encrypt (cioè, per la crittografia del contenuto).
"Enc_Recipient" per una codifica del destinatario da inserire in una struttura dati COSE_Encrypt.
"Mac_Recipient" per una codifica del destinatario da inserire in una struttura di messaggio MACed.
"Rec_Recipient" per una codifica del destinatario da inserire in una struttura del destinatario.
-
Gli attributi protetti dalla struttura del corpo, codificati come tipo bstr. Se non ci sono attributi protetti, viene utilizzata una stringa di byte di lunghezza zero.
-
I dati forniti esternamente dall'applicazione codificati come tipo bstr. Se questo campo non viene fornito, il valore predefinito è una stringa di byte di lunghezza zero. (Vedere la Sezione 4.3 per le indicazioni applicative sulla costruzione di questo campo.)
Il frammento CDDL che descrive il testo sopra è:
Enc_structure = [ context : "Encrypt" / "Encrypt0" / "Enc_Recipient" / "Mac_Recipient" / "Rec_Recipient", protected : empty_or_serialized_map, external_aad : bstr ]
Come crittografare un messaggio:
-
Creare una Enc_structure e riempirla con i campi appropriati.
-
Codificare la Enc_structure in una stringa di byte (Dati Autenticati Aggiuntivi (AAD)), utilizzando la codifica descritta nella Sezione 9.
-
Determinare la chiave di crittografia (K). Questo passaggio dipende dalla classe di algoritmo del destinatario utilizzata. Per:
No Recipients (Nessun destinatario): La chiave da utilizzare è determinata dall'algoritmo e dalla chiave al livello corrente. Esempi sono le chiavi key wrap (Sezione 8.5.2) e i segreti pre-condivisi.
Direct Encryption and Direct Key Agreement (Crittografia diretta e accordo chiave diretto): La chiave è determinata dalla chiave e dall'algoritmo nella struttura del destinatario. L'algoritmo di crittografia e la dimensione della chiave da utilizzare sono input per la KDF utilizzata per il destinatario. (Per diretto, la KDF può essere considerata come l'operazione identità.) Esempi di questi algoritmi si trovano nelle Sezioni 6.1 e 6.3 di [RFC9053].
Other (Altro): La chiave è generata casualmente.
-
Chiamare l'algoritmo di crittografia con K (la chiave di crittografia), P (il testo in chiaro) e AAD. Posizionare il testo cifrato restituito nel campo "ciphertext" della struttura.
-
Per i destinatari del messaggio che utilizzano algoritmi non diretti, eseguire ricorsivamente l'algoritmo di crittografia per quel destinatario, utilizzando K (la chiave di crittografia) come testo in chiaro.
Come decifrare un messaggio:
-
Creare una Enc_structure e riempirla con i campi appropriati.
-
Codificare la Enc_structure in una stringa di byte (AAD), utilizzando la codifica descritta nella Sezione 9.
-
Determinare la chiave di decifrazione. Questo passaggio dipende dalla classe di algoritmo del destinatario utilizzata. Per:
No Recipients (Nessun destinatario): La chiave da utilizzare è determinata dall'algoritmo e dalla chiave al livello corrente. Esempi sono le chiavi key wrap (Sezione 8.5.2) e i segreti pre-condivisi.
Direct Encryption and Direct Key Agreement (Crittografia diretta e accordo chiave diretto): La chiave è determinata dalla chiave e dall'algoritmo nella struttura del destinatario. L'algoritmo di crittografia e la dimensione della chiave da utilizzare sono input per la KDF utilizzata per il destinatario. (Per diretto, la KDF può essere considerata come l'operazione identità.)
Other (Altro): La chiave è determinata decodificando e decifrando una delle strutture del destinatario.
-
Chiamare l'algoritmo di decifrazione con K (la chiave di decifrazione da utilizzare), C (il testo cifrato) e AAD.
5.4. Come crittografare e decifrare per algoritmi AE
Come crittografare un messaggio:
-
Verificare che il campo "protected" sia una stringa di byte di lunghezza zero.
-
Verificare che non siano stati forniti dati autenticati aggiuntivi esterni per questa operazione.
-
Determinare la chiave di crittografia. Questo passaggio dipende dalla classe di algoritmo del destinatario utilizzata. Per:
No Recipients (Nessun destinatario): La chiave da utilizzare è determinata dall'algoritmo e dalla chiave al livello corrente. Esempi sono le chiavi key wrap (Sezione 8.5.2) e i segreti pre-condivisi.
Direct Encryption and Direct Key Agreement (Crittografia diretta e accordo chiave diretto): La chiave è determinata dalla chiave e dall'algoritmo nella struttura del destinatario. L'algoritmo di crittografia e la dimensione della chiave da utilizzare sono input per la KDF utilizzata per il destinatario. (Per diretto, la KDF può essere considerata come l'operazione identità.) Esempi di questi algoritmi si trovano nelle Sezioni 6.1 e 6.3 di [RFC9053].
Other (Altro): La chiave è generata casualmente.
-
Chiamare l'algoritmo di crittografia con K (la chiave di crittografia da utilizzare) e P (il testo in chiaro). Posizionare il testo cifrato restituito nel campo "ciphertext" della struttura.
-
Per i destinatari del messaggio che utilizzano algoritmi non diretti, eseguire ricorsivamente l'algoritmo di crittografia per quel destinatario, utilizzando K (la chiave di crittografia) come testo in chiaro.
Come decifrare un messaggio:
-
Verificare che il campo "protected" sia una stringa di byte di lunghezza zero.
-
Verificare che non siano stati forniti dati autenticati aggiuntivi esterni per questa operazione.
-
Determinare la chiave di decifrazione. Questo passaggio dipende dalla classe di algoritmo del destinatario utilizzata. Per:
No Recipients (Nessun destinatario): La chiave da utilizzare è determinata dall'algoritmo e dalla chiave al livello corrente. Esempi sono le chiavi key wrap (Sezione 8.5.2) e i segreti pre-condivisi.
Direct Encryption and Direct Key Agreement (Crittografia diretta e accordo chiave diretto): La chiave è determinata dalla chiave e dall'algoritmo nella struttura del destinatario. L'algoritmo di crittografia e la dimensione della chiave da utilizzare sono input per la KDF utilizzata per il destinatario. (Per diretto, la KDF può essere considerata come l'operazione identità.) Esempi di questi algoritmi si trovano nelle Sezioni 6.1 e 6.3 di [RFC9053].
Other (Altro): La chiave è determinata decodificando e decifrando una delle strutture del destinatario.
-
Chiamare l'algoritmo di decifrazione con K (la chiave di decifrazione da utilizzare) e C (il testo cifrato).