Condividi tramite


Generazione di chiavi per crittografia e decrittografia

La creazione e la gestione di chiavi sono due momenti importanti del processo di crittografia. Gli algoritmi simmetrici richiedono la creazione di una chiave e di un vettore di inizializzazione da non rivelare a chi non è autorizzato a decrittografare i dati. Gli algoritmi asimmetrici richiedono la creazione di una chiave pubblica e di una chiave privata. La chiave pubblica può essere resa pubblica a chiunque, mentre quella privata deve essere nota solo alla parte che decrittograferà i dati crittografati con la chiave pubblica. In questa sezione verrà descritto come generare e gestire chiavi sia per gli algoritmi simmetrici che per quelli asimmetrici.

Chiavi simmetriche

Le classi di crittografia simmetrica disponibili in .NET Framework richiedono una chiave e un nuovo vettore di inizializzazione (IV, Initialization Vector) per crittografare e decrittografare i dati. Ogni volta che si crea una nuova istanza di una delle classi di crittografia simmetrica gestite mediante il costruttore predefinito, vengono automaticamente creati una chiave e un vettore di inizializzazione nuovi. Per essere in grado di decrittografare i dati, i destinatari devono disporre della stessa chiave e dello stesso vettore di inizializzazione e devono utilizzare il medesimo algoritmo di crittografia. Generalmente è necessario creare una chiave e un vettore di inizializzazione nuovi per ogni sessione e né la chiave né il vettore devono essere archiviati per un utilizzo in una sessione successiva.

Per comunicare una chiave simmetrica e un vettore di inizializzazione a una persona distante, generalmente viene crittografata la chiave simmetrica e il vettore di inizializzazione mediante la crittografia asimmetrica. L'invio di tali valori in una rete non protetta senza eseguire la crittografia può provocare dei rischi, poiché chiunque li intercetti è in grado di decrittografare i dati. Per ulteriori informazioni su questo processo di crittografia e trasferimento della chiave e del vettore di inizializzazione, vedere Creazione di uno schema di crittografia.

Nell'esempio riportato di seguito viene illustrata la creazione di una nuova istanza della classe TripleDESCryptoServiceProvider che implementa l'algoritmo TripleDES.

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();

Quando viene eseguito il codice precedente, una chiave e un vettore di inizializzazione nuovi vengono generati e inseriti rispettivamente nelle proprietà Key e IV.

Talvolta può essere necessario generare più chiavi. In questa situazione è possibile creare una nuova istanza di una classe che implementa un algoritmo simmetrico e quindi creare una chiave e un vettore di inizializzazione nuovi chiamando i metodi GenerateKey and GenerateIV. Nell'esempio di codice che segue viene illustrato come generare chiavi e vettori di inizializzazione nuovi dopo aver creato una nuova istanza della classe di crittografia asimmetrica.

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();

Quando viene eseguito il codice precedente, una chiave e un vettore di inizializzazione nuovi vengono generati quando viene creata la nuova istanza di TripleDESCryptoServiceProvider. Un'altra chiave e vettore di inizializzazione vengono creati quando vengono chiamati i metodi GenerateKey and GenerateIV.

Chiavi asimmetriche

In .NET Framework sono incluse le classi RSACryptoServiceProvider e DSACryptoServiceProvider per la crittografia asimmetrica. Queste classi creano una coppia di chiavi pubblica/privata quando si utilizza il costruttore predefinito per creare una nuova istanza. Le chiavi asimmetriche possono essere archiviate per un utilizzo in più sessioni o generate per una sola sessione. Mentre la chiave pubblica può essere generalmente resa disponibile, la chiave privata va custodita con cura.

Una coppia di chiavi pubblica/privata viene generata ogni volta che viene creata una nuova istanza di una classe di algoritmo asimmetrico. Dopo che è stata creata una nuova istanza della classe, le informazioni sulla chiave possono essere estratte mediante uno dei metodi indicati di seguito:

  • Il metodo ToXMLString, che restituisce una rappresentazione XML delle informazioni sulla chiave.

  • Il metodo ExportParameters, che restituisce una struttura RSAParameters contenente le informazioni sulla chiave.

Entrambi i metodi accettano un valore Boolean che indica se restituire solo le informazioni sulla chiave pubblica o le informazioni sia sulla chiave pubblica che sulla chiave privata. Una classe RSACryptoServiceProvider può essere inizializzata in base al valore di una struttura RSAParameters utilizzando il metodo ImportParameters.

Le chiavi private asimmetriche non devono mai essere archiviate sotto forma di testo o di testo non crittografato nel computer locale. Se è necessario archiviare una chiave privata, è opportuno utilizzare un contenitore di chiavi. Per ulteriori informazioni su come archiviare una chiave privata in un contenitore, vedere Procedura: archiviare chiavi asimmetriche in un contenitore di chiavi.

Nell'esempio di codice che segue viene creata una nuova istanza della classe RSACryptoServiceProvider, che crea una coppia di chiavi pubblica/privata e salva le informazioni sulla chiave pubblica in una struttura RSAParameters.

'Generate a public/private key pair.
Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider()
'Save the public key information to an RSAParameters structure.
Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);

Vedere anche

Attività

Procedura: archiviare chiavi asimmetriche in un contenitore di chiavi

Concetti

Crittografia dei dati

Decrittografia di dati

Servizi di crittografia

Altre risorse

Attività di crittografia