Generare chiavi per crittografia e decrittografia

La creazione e la gestione di chiavi sono due momenti importanti del processo di crittografia. Per gli algoritmi simmetrici è richiesta la creazione di una chiave e un vettore di inizializzazione (IV). È necessario mantenere questa chiave segreta da chiunque non debba decrittografare i dati. Il vettore di inizializzazione non deve rimanere segreto, ma dovrebbe essere modificato per ogni sessione. Gli algoritmi asimmetrici richiedono la creazione di una chiave pubblica e di una chiave privata. La chiave pubblica può essere resa nota a chiunque, ma la parte di decrittografia deve conoscere solo la chiave privata corrispondente. Questa sezione descrive come generare e gestire chiavi sia per gli algoritmi simmetrici che per quelli asimmetrici.

Chiavi simmetriche

Le classi di crittografia simmetrica fornite da .NET richiedono una chiave e un nuovo IV per crittografare e decrittografare i dati. Una nuova chiave e un nuovo IV vengono create automaticamente quando si crea una nuova istanza di una delle classi crittografiche simmetriche gestite usando il metodo Create() senza parametri. Per riuscire a decrittografare i dati, i destinatari devono avere la stessa chiave e lo stesso vettore di inizializzazione e devono usare 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 uso in una sessione successiva.

Per comunicare una chiave simmetrica e un vettore di inizializzazione a una parte remota, la chiave simmetrica viene generalmente crittografata mediante la crittografia asimmetrica. L'invio della chiave in una rete non protetta senza crittografia non è sicuro, poiché chiunque intercetti la chiave e il vettore di inizializzazione è in grado di decrittografare i dati.

Nell'esempio seguente viene illustrata la creazione di una nuova istanza della classe di implementazione predefinita per l'algoritmo Aes:

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

L'esecuzione del codice precedente genera una nuova chiave e un nuovo IV, e le imposta rispettivamente come valori per le proprietà Key e IV.

Talvolta può essere necessario generare più chiavi. In questo caso, è possibile creare una nuova istanza di una classe che implementa un algoritmo simmetrico. Creare quindi una nuova chiave e un nuovo IV chiamando i metodi GenerateKey e GenerateIV. L'esempio di codice seguente illustra come generare chiavi e vettori di inizializzazione (IV) nuovi dopo aver creato una nuova istanza della classe di crittografia asimmetrica:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

L'esecuzione del codice precedente crea una nuova istanza di Aes e genera una chiave e un IV. Un'altra chiave e un altro IV vengono create quando vengono chiamati i metodi GenerateKey e GenerateIV.

Chiavi asimmetriche

.NET fornisce la classe RSA per la crittografia asimmetrica. Quando si usa il metodo senza parametri Create() per creare una nuova istanza, la classe RSA crea una coppia di chiavi pubbliche/private. Le chiavi asimmetriche possono essere archiviate per un uso in più sessioni o generate per una sola sessione. Anche se è possibile rendere disponibile la chiave pubblica, è necessario proteggere attentamente la chiave privata.

Una coppia di chiavi pubblica/privata viene generata ogni volta che viene creata una nuova istanza di una classe di algoritmo asimmetrico. Dopo aver creato una nuova istanza della classe, è possibile estrarre le informazioni sulla chiave usando il metodo ExportParameters. Questo metodo restituisce una struttura RSAParameters che contiene le informazioni sulla chiave. Il metodo accetta anche un valore Boolean che indica se restituire solo le informazioni sulla chiave pubblica o le informazioni sia sulla chiave pubblica che sulla chiave privata.

È anche possibile usare altri metodi per estrarre le informazioni sulla chiave, ad esempio:

È possibile utilizzare il metodo ImportParameters per inizializzare un'istanza di RSA sul valore di una struttura RSAParameters. In alternativa, è possibile usare il metodo RSA.Create(RSAParameters) per creare una nuova istanza.

Non archiviare mai chiavi private asimmetriche verbatim o come testo normale nel computer locale. Se è necessario archiviare una chiave privata, è necessario usare un contenitore di chiavi. Per altre informazioni su come archiviare una chiave privata in un contenitore di chiavi, vedere Procedura: Archiviare chiavi asimmetriche in un contenitore di chiavi.

L'esempio di codice seguente crea una nuova istanza della classe RSA, crea una coppia di chiavi pubbliche/private e salva le informazioni sulla chiave pubblica in una struttura RSAParameters:

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

Vedi anche