Condividi tramite


Codifica dei dati avvolti

I dati in busta sono costituiti da contenuto crittografato di qualsiasi tipo e chiavi di sessione di crittografia del contenuto crittografate per uno o più destinatari. I messaggi incapsati mantengono il contenuto del segreto del messaggio e consentono solo a persone o entità specificate di recuperare il contenuto.

La sintassi dei messaggi crittografici (CMS) può essere usata per codificare i messaggi in busta. CMS supporta tre tecniche di gestione delle chiavi: trasporto delle chiavi, contratto di chiave e chiavi simmetriche distribuite in precedenza (KEK). KEK simmetrico distribuito precedentemente è noto anche come distribuzione delle chiavi per lista di distribuzione.

In ognuna di queste tre tecniche viene generata una singola chiave di sessione per crittografare il messaggio in busta. I problemi di gestione delle chiavi gestiscono il modo in cui la chiave di sessione viene crittografata dal mittente e decrittografata da un ricevitore. Un singolo messaggio crittografato può essere distribuito a molti destinatari usando una combinazione delle tecniche di gestione delle chiavi.

La gestione delle chiavi di trasporto utilizza la chiave pubblica di un ricevitore designato per crittografare la chiave di sessione. Il ricevitore decrittografa la chiave di sessione usando la chiave privata associata alla chiave pubblica usata per crittografare. Il ricevitore usa quindi la chiave di sessione decrittografata per decrittografare i dati in busta. Quando si usa il trasporto delle chiavi, il ricevitore non ha confermato informazioni sull'identità del mittente.

Nella gestione dell'accordo di chiave, viene generata una chiave privata temporanea Diffie-Hellman e usata per crittografare la chiave di sessione. La chiave pubblica corrispondente alla chiave privata temporanea viene inclusa come parte delle informazioni sul destinatario del messaggio. Il destinatario decrittografa la chiave di sessione utilizzando la chiave effimera ricevuta e usa questa chiave di sessione decrittografata per decrittografare il messaggio incapsulato. L'uso di un accordo di chiave effimera in combinazione con la chiave privata del destinatario del messaggio fornisce al destinatario informazioni confermate sull'identità del mittente.

Per la gestione delle chiavi utilizzando le chiavi simmetriche distribuite in precedenza, ogni messaggio include la chiave di crittografia del contenuto crittografata con una chiave di crittografia utilizzata per le chiavi, distribuita in precedenza. I ricevitori usano la chiave di crittografia della chiave precedentemente distribuita per decrittografare la chiave di crittografia del contenuto, quindi utilizzano la chiave di crittografia del contenuto decrittografata per decrittografare il messaggio nell'involucro.

Nella figura seguente viene illustrata una tipica sequenza di eventi CMS per la codifica dei dati in busta.

codifica dei dati avvolti

  • Viene recuperato un puntatore al messaggio di testo non crittografato.
  • Viene generata una chiave simmetrica (sessione).
  • Il chiave simmetrica e l'algoritmo di crittografia specificato vengono usati per crittografare i dati del messaggio.
  • Viene aperto un store di certificati .
  • Il certificato del destinatario viene recuperato dall'archivio.
  • La chiave pubblica viene recuperata dal certificato del destinatario.
  • Usando la chiave pubblica del destinatario, la chiave simmetrica viene crittografata.
  • Dal certificato del destinatario viene recuperato l'ID del destinatario.
  • Le informazioni seguenti sono incluse nel messaggio in formato digitale: algoritmo di crittografia dei dati, dati crittografati, chiave simmetrica crittografata e struttura delle informazioni del destinatario.

Per usare funzioni di messaggio di basso livello per eseguire le attività tipiche elencate, usare la procedura seguente.

Codificare un messaggio in busta

  1. Creare o recuperare il contenuto.

  2. Ottieni un provider crittografico.

  3. Ottenere un certificato del destinatario.

  4. Inizializzare la struttura CMSG_ENVELOPED_ENCODE_INFO.

  5. Chiamare CryptMsgCalculateEncodedLength per ottenere le dimensioni del BLOB dei messaggi codificati. Allocare memoria per questa.

  6. Chiamare CryptMsgOpenToEncode, passando CMSG_ENVELOPED per dwMsgType e un puntatore a CMSG_ENVELOPED_ENCODE_INFO per pvMsgEncodeInfo. Dopo questa chiamata, riceverai un identificativo per il messaggio aperto.

  7. Chiamare CryptMsgUpdate, passando l'handle recuperato nel passaggio 6 e un puntatore ai dati da crittografare, incapsulare e codificare. Questa funzione può essere chiamata il maggior numero di volte necessario per completare il processo di codifica.

  8. Chiamare CryptMsgGetParam, passando l'handle recuperato nel passaggio 6 e i tipi di parametri appropriati per accedere ai dati codificati desiderati. Ad esempio, passare CMSG_CONTENT_PARAM per ottenere un puntatore al messaggio PKCS #7 completo.

    Se il risultato di questa codifica deve essere usato come dati interni per un altro messaggio codificato, ad esempio un messaggio in busta, è necessario passare il parametro CMSG_BARE_CONTENT_PARAM. Per un esempio, vedere codice alternativo per codificare un messaggio in busta.

  9. Chiudere il messaggio chiamando CryptMsgClose.

Il risultato di questa procedura è un messaggio codificato che contiene i dati crittografati, la chiave simmetrica crittografata con le chiavi pubbliche del destinatario e le strutture dei dati delle informazioni del destinatario. La combinazione di contenuto crittografato e una chiave simmetrica crittografata per un destinatario è una busta digitale per tale destinatario. Qualsiasi tipo di contenuto può essere confezionato per più destinatari.

Esempio di programma C : codifica di un messaggio firmato e in busta