Chiavi crittografiche

Questo articolo illustra come usare le funzioni di derivazione delle chiavi standard per derivare le chiavi e come crittografare il contenuto usando chiavi simmetriche e asimmetriche.

Chiavi simmetriche

La crittografia della chiave simmetrica, detta anche crittografia della chiave privata, richiede che la chiave usata per la crittografia venga usata anche per la decrittografia. È possibile usare una classe SymmetricKeyAlgorithmProvider per specificare un algoritmo simmetrico e creare o importare una chiave. È possibile usare metodi statici nella classe CryptographicEngine per crittografare e decrittografare i dati usando l'algoritmo e la chiave.

La crittografia a chiave simmetrica usa in genere crittografie a blocchi e modalità di crittografia a blocchi. Una crittografia a blocchi è una funzione di crittografia simmetrica che opera su blocchi a dimensione fissa. Se il messaggio da crittografare è più lungo della lunghezza del blocco, è necessario usare una modalità di crittografia a blocchi. Una modalità di crittografia a blocchi è una funzione di crittografia simmetrica compilata usando una crittografia a blocchi. Crittografa il testo non crittografato come una serie di blocchi a dimensione fissa. Sono supportate le modalità per le app seguenti:

  • La modalità ECB (electronic codebook) crittografa ogni blocco del messaggio separatamente. Questa opzione non è considerata una modalità di crittografia sicura.
  • La modalità CBC (cipher block chaining) usa il blocco di testo crittografato precedente per offuscare il blocco corrente. È necessario determinare il valore da usare per il primo blocco. Questo valore è denominato vettore di inizializzazione (IV).
  • La modalità CCM (contatore con CBC-MAC) combina la modalità di crittografia a blocchi CBC con un codice MAC (Message Authentication Code).
  • La modalità GCM (modalità contatore Galois) combina la modalità di crittografia dei contatori con la modalità di autenticazione Galois.

Per alcune modalità, ad esempio CBC, è necessario usare un vettore di inizializzazione (IV) per il primo blocco di testo crittografato. Di seguito sono riportati i vettori di inizializzazione comuni. Specificare IV quando si chiama CryptographicEngine.Encrypt. Nella maggior parte dei casi è importante che IV non venga mai riutilizzata con la stessa chiave.

  • Fisso usa lo stesso IV per tutti i messaggi da crittografare. Questo perde informazioni e il suo uso non è consigliato.
  • Il contatore incrementa IV per ogni blocco.
  • Casuale crea un IV pseudorandom. È possibile usare CryptographicBuffer.GenerateRandom per creare IV.
  • Nonce-Generated usa un numero univoco per ogni messaggio da crittografare. In genere, il nonce è un messaggio o un identificatore di transazione modificato. Il nonce non deve essere mantenuto segreto, ma non deve mai essere riutilizzato nella stessa chiave.

La maggior parte delle modalità richiede che la lunghezza del testo non crittografato sia un multiplo esatto delle dimensioni del blocco. Ciò richiede in genere di riempire il testo non crittografato per ottenere la lunghezza appropriata.

Mentre le crittografie a blocchi crittografano blocchi a dimensione fissa di dati, le crittografie di flusso sono funzioni di crittografia simmetrica che combinano bit di testo non crittografato con un flusso di bit pseudorandom (denominato flusso di chiavi) per generare il testo crittografato. Alcune modalità di crittografia a blocchi, ad esempio la modalità feedback di output (OTF) e la modalità contatore (CTR) trasformano in modo efficace una crittografia a blocchi in una crittografia del flusso. Le crittografie di flusso effettive, ad esempio RC4, tuttavia, funzionano a velocità più elevate rispetto alle modalità di crittografia a blocchi.

Nell'esempio seguente viene illustrato come usare la classe SymmetricKeyAlgorithmProvider per creare una chiave simmetrica e usarla per crittografare e decrittografare i dati.

Chiavi asimmetriche

La crittografia a chiave asimmetrica, detta anche crittografia a chiave pubblica, usa una chiave pubblica e una chiave privata per eseguire la crittografia e la decrittografia. Le chiavi sono diverse ma matematicamente correlate. In genere la chiave privata viene mantenuta segreta e viene usata per decrittografare i dati mentre la chiave pubblica viene distribuita alle parti interessate e viene usata per crittografare i dati. La crittografia asimmetrica è utile anche per la firma dei dati.

Poiché la crittografia asimmetrica è molto più lenta rispetto alla crittografia simmetrica, raramente viene usata per crittografare direttamente grandi quantità di dati. Viene in genere usato nel modo seguente per crittografare le chiavi.

  • Alice richiede che Bob invii solo i messaggi crittografati.
  • Alice crea una coppia di chiavi privata/pubblica, mantiene il segreto della chiave privata e pubblica la chiave pubblica.
  • Bob ha un messaggio che vuole inviare ad Alice.
  • Bob crea una chiave simmetrica.
  • Bob usa la nuova chiave simmetrica per crittografare il messaggio in Alice.
  • Bob usa la chiave pubblica di Alice per crittografare la chiave simmetrica.
  • Bob invia il messaggio crittografato e la chiave simmetrica crittografata ad Alice (incapsulata).
  • Alice usa la chiave privata (dalla coppia privata/pubblica) per decrittografare la chiave simmetrica di Bob.
  • Alice usa la chiave simmetrica di Bob per decrittografare il messaggio.

È possibile utilizzare un oggetto AsymmetricKeyAlgorithmProvider per specificare un algoritmo asimmetrico o un algoritmo di firma, per creare o importare una coppia di chiavi temporanee oppure per importare la parte chiave pubblica di una coppia di chiavi.

Derivazione di chiavi

Spesso è necessario derivare chiavi aggiuntive da un segreto condiviso. È possibile usare la classe KeyDerivationAlgorithmProvider e uno dei metodi specializzati seguenti nella classe KeyDerivationParameters per derivare chiavi.

Oggetto Descrizione
BuildForPbkdf2 Crea un oggetto KeyDerivationParameters da usare nella funzione di derivazione della chiave basata su password 2 (PBKDF2).
BuildForSP800108 Crea un oggetto KeyDerivationParameters da usare in modalità contatore, funzione di derivazione della chiave HMAC (Hash-Based Message Authentication Code).
BuildForSP80056a Crea un oggetto KeyDerivationParameters da utilizzare nella funzione di derivazione della chiave SP800-56A.