Condividi tramite


Codifica dei dati firmati

I dati firmati sono costituiti da contenuto di qualsiasi tipo e hash crittografati del contenuto da zero o più firmatari. L'hash risultante può confermare che il messaggio originale non è stato modificato dopo la firma e che determinate persone o entità hanno firmato i dati.

La figura seguente illustra la procedura per la codifica di un messaggio firmato. L'elenco che segue la figura descrive i passaggi.

Un messaggio può avere più firmatari, algoritmi di hash e certificati. Mentre la figura mostra solo certificati, CRL e CRL possono usare lo stesso processo. Si adattano all'illustrazione ovunque vengano visualizzati i certificati.

codifica di un messaggio firmato

Il processo generale per la codifica dei dati firmati è il seguente.

Per codificare i dati firmati

  1. I dati vengono creati (se necessario) e viene recuperato un puntatore.
  2. Viene aperto un archivio certificati contenente il certificato del firmatario.
  3. La chiave privata per il certificato viene recuperata. Esistono due proprietà che devono essere impostate sul certificato prima di usarle. Uno viene usato per collegare un certificato a un provider di servizi di configurazione specifico e, all'interno di tale CSP, a un determinato contenitore di chiavi private. L'altro viene usato per indicare quale algoritmo hash deve essere utilizzato quando viene chiamata un'operazione hash . Queste devono essere impostate una sola volta.
  4. La proprietà di un certificato determina l'algoritmo hash.
  5. Un hash dei dati viene creato inviando i dati tramite la funzione hash.
  6. La firma viene creata crittografando l'hash usando la chiave privata, ottenuta tramite una proprietà sul certificato.
  7. I dati seguenti sono inclusi nel messaggio firmato completato:
    • Dati originali da firmare
    • Algoritmi hash
    • Le firme
    • Strutture delle informazioni del firmatario, che includono l'identificatore del firmatario (autorità di certificazione e numero di serie)
    • Certificati del firmatario (facoltativo)

Questa procedura illustra un caso semplice. I casi più complessi includono attributi autenticati inclusi nel messaggio. Quando il tipo di contenuto è qualcosa di diverso da una stringa BYTE o è presente almeno un attributo autenticato insieme a qualsiasi tipo di dati, sono necessari due attributi autenticati standard: il tipo di contenuto (dati) e l'hash del contenuto. In queste circostanze , CryptoAPI fornisce automaticamente questi due attributi obbligatori. Le funzioni di messaggio di basso livello eseguono l'hash degli attributi autenticati, crittografano l'hash con la chiave privata e lo forniscono come firma.

Usare le funzioni di messaggio di basso livello per eseguire le attività elencate, usando la procedura seguente.

Per codificare un messaggio firmato

  1. Creare o recuperare il contenuto.

  2. Ottenere un provider di crittografia.

  3. Ottenere i certificati del firmatario.

  4. Inizializzare la struttura CMSG_SIGNER_ENCODE_INFO .

  5. Inizializzare la struttura CMSG_SIGNED_ENCODE_INFO .

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

  7. Chiamare CryptMsgOpenToEncode, passando CMSG_SIGNED per dwMsgType e un puntatore a CMSG_SIGNED_ENCODE_INFO per pvMsgEncodeInfo per ottenere un handle al messaggio aperto.

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

  9. Chiamare CryptMsgGetParam, passando l'handle recuperato nel passaggio 7 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 che mostra questo, vedere Codice alternativo per la codifica di un messaggio in busta.

  10. Chiudere il messaggio chiamando CryptMsgClose.

Il risultato di questa procedura è un messaggio codificato che contiene i dati originali, l'hash crittografato di tali dati (firma) e le informazioni sul firmatario. È disponibile anche un puntatore al BLOB codificato desiderato.

Per informazioni dettagliate sulla codifica C, vedere Esempio di programma C: firma, codifica, decodifica e verifica di un messaggio.