Condividi tramite


Codifica dei dati in busta

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 in busta 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 di crittografia della chiave simmetrica (KEK) distribuite in precedenza. La chiave KEK simmetrica distribuita in precedenza è nota anche come distribuzione delle chiavi della lista di distribuzione.

In ognuna di queste tre tecniche viene generata una singola chiave di sessione per crittografare il messaggio in busto. 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 delle chiavi usa la chiave pubblica di un ricevitore previsto 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 viene utilizzato il trasporto delle chiavi, il ricevitore non ha confermato le informazioni sull'identità del mittente.

Nella gestione dei contratti di chiave viene generata una chiave privata temporanea Diffie-Hellman temporanea 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 usando la chiave temporanea ricevuta e usa questa chiave di sessione decrittografata per decrittografare il messaggio in busta. Usando un contratto di chiave temporanea in combinazione con la chiave privata del ricevitore, il destinatario del messaggio ha confermato le informazioni sull'identità del mittente.

Per la gestione delle chiavi che usano chiavi simmetriche distribuite in precedenza, ogni messaggio include la chiave di crittografia del contenuto crittografata con una chiave di crittografia della chiave distribuita in precedenza. I ricevitori usano la chiave di crittografia della chiave distribuita in precedenza per decrittografare la chiave di crittografia del contenuto, quindi usare la chiave di crittografia del contenuto decrittografata per decrittografare il messaggio in busta.

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

codifica dei dati in busta

  • Viene recuperato un puntatore al messaggio di testo non crittografato .
  • Viene generata una chiave simmetrica (sessione).
  • La chiave simmetrica e l'algoritmo di crittografia specificati vengono usati per crittografare i dati del messaggio.
  • Viene aperto un archivio 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 sul destinatario.

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

Per codificare un messaggio in busta

  1. Creare o recuperare il contenuto.

  2. Ottenere un provider di crittografia.

  3. Ottenere un certificato del destinatario.

  4. Inizializzare la struttura CMSG_ENVELOPED_ENCODE_INFO .

  5. Chiamare CryptMsgCalculateEncodedLength per ottenere le dimensioni del BLOB del messaggio codificato. Allocare memoria per tale memoria.

  6. Chiamare CryptMsgOpenToEncode passando CMSG_ENVELOPED per dwMsgType e un puntatore a CMSG_ENVELOPED_ENCODE_INFO per pvMsgEncodeInfo. In seguito a questa chiamata, si otterrà un handle per il messaggio aperto.

  7. Chiamare CryptMsgUpdate, passando l'handle recuperato nel passaggio 6 e un puntatore ai dati da crittografare, in busta e codificati. Questa funzione può essere chiamata tutte le volte necessario per completare il processo di codifica.

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

    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 la codifica di 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 il destinatario. Qualsiasi tipo di contenuto può essere in busto per più destinatari.

Programma C di esempio: codifica di un messaggio in busta firmato