Condividi tramite


Codifica e decodifica di un messaggio con hash

I dati con hash sono costituiti da contenuto di qualsiasi tipo e da un hash del contenuto. Può essere usato solo quando è necessario verificare che il contenuto del messaggio non sia stato modificato dopo la creazione dell'hash.

Quando si crea un messaggio con hash, possono essere presenti più algoritmi di hashing e più hash. La figura seguente illustra le attività necessarie per codificare un messaggio con hash. La procedura è descritta nel testo che segue l'illustrazione.

creazione di un messaggio con hash

Per creare un messaggio con hash

  1. Ottieni un puntatore ai dati di cui effettuare l'hashing.
  2. Selezionare l'algoritmo hash da usare.
  3. Inserire i dati tramite una funzione hash usando l'algoritmo hash.
  4. Includere i dati originali da hashing, gli algoritmi di hash e gli hash nel messaggio codificato.

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

Per eseguire l'hashing e codificare un messaggio usando funzioni di messaggio di basso livello

  1. Creare o recuperare il contenuto di cui eseguire l'hashing.

  2. Ottenere un provider di crittografia.

  3. Inizializzare la struttura CMSG_HASHED_ENCODE_INFO.

  4. Chiamare CryptMsgCalculateEncodedLength per ottenere le dimensioni del BLOB dei messaggi codificati. Allocare memoria per esso.

  5. Chiamare CryptMsgOpenToEncode, passando CMSG_HASHED per il parametro dwMsgType e un puntatore a CMSG_HASHED_ENCODE_INFO per il parametro pvMsgEncodeInfo. A seguito di questa chiamata, ottieni un handle per il messaggio aperto.

  6. Chiamare CryptMsgUpdate, passando l'handle recuperato nel passaggio 5 e un puntatore ai dati sui quali eseguire l'hashing e la codifica. Questa funzione può essere chiamata il maggior numero di volte necessario per completare il processo di codifica.

  7. Chiamare CryptMsgGetParam, passando l'handle recuperato nel passaggio 5 e i tipi di parametri 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, CMSG_BARE_CONTENT_PARAM deve essere passato. Per un esempio che mostra questo, vedere il codice alternativo per codificare un messaggio in busta .

  8. Chiudere il messaggio chiamando CryptMsgClose.

Il risultato di questa procedura è un messaggio codificato che contiene i dati originali, gli algoritmi di hash e l'hash di tali dati. Un puntatore al messaggio codificato BLOB viene ottenuto nel passaggio 7.

Le due procedure seguenti decodificano e quindi verificano i dati con hash.

Per decodificare i dati con hash

  1. Ottieni un puntatore al BLOB codificato.
  2. Chiamare CryptMsgOpenToDecode, passando gli argomenti necessari.
  3. Chiamare CryptMsgUpdate una sola volta, passando l'handle recuperato nel passaggio 2 e un puntatore ai dati da decodificare. In questo modo le azioni appropriate vengono eseguite sul messaggio, a seconda del tipo di messaggio.
  4. Chiamare CryptMsgGetParam, passando l'handle recuperato nel passaggio 2 e i tipi di parametri appropriati per accedere ai dati decodificati desiderati. Ad esempio, passare CMSG_CONTENT_PARAM per ottenere un puntatore al contenuto decodificato.

Per verificare l'hash

  1. Chiamare CryptMsgControl, passando CMSG_CTRL_VERIFY_HASH per verificare gli hash.
  2. Chiamare CryptMsgClose per chiudere il messaggio.

Per un programma di esempio, vedere Programma C di esempio: codifica e decodifica di un messaggio con hash.