Procedura: archiviare chiavi asimmetriche in un contenitore di chiavi

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 sui contenitori di chiavi, vedere Informazioni sui contenitori di chiavi RSA a livello di computer e utente.

Per creare una chiave asimmetrica e salvarla in un contenitore di chiavi:

  1. Creare una nuova istanza di una classe CspParameters e passare il nome con il quale si intende indicare il contenitore di chiavi al campo CspParameters.KeyContainerName.

  2. Creare una nuova istanza di una classe derivata dalla classe AsymmetricAlgorithm, generalmente RSACryptoServiceProvider o DSACryptoServiceProvider, e passare l'oggetto CspParameters creato in precedenza al relativo costruttore.

Per eliminare una chiave da un contenitore di chiavi:

  1. Creare una nuova istanza della classe CspParameters e passare il nome con il quale si intende indicare il contenitore di chiavi al campo CspParameters.KeyContainerName.

  2. Creare una nuova istanza di una classe derivata dalla classe AsymmetricAlgorithm, di solito RSACryptoServiceProvider o DSACryptoServiceProvider, e passare l'oggetto CspParameters creato in precedenza al relativo costruttore.

  3. Impostare la proprietà PersistKeyInCSP della classe che deriva da AsymmetricAlgorithm su false (False in Visual Basic).

  4. Chiamare il metodo Clear della classe che deriva da AsymmetricAlgorithm. Questo metodo libera tutte le risorse della classe e cancella il contenitore di chiavi.

Esempio

Nell'esempio riportato di seguito viene illustrato come creare una chiave asimmetrica, salvarla in un contenitore di chiavi, recuperare la chiave in un secondo momento ed eliminare la chiave dal contenitore.

Si noti che la parte di codice presente nel metodo GenKey_SaveInContainer e nel metodo GetKeyFromContainer è simile. Quando si specifica un nome di contenitore di chiavi per un oggetto CspParameters e si passa tale nome a un oggetto AsymmetricAlgorithm con la proprietà PersistKeyInCsp o PersistKeyInCsp impostata su true, si verifica una delle seguenti situazioni. Se il contenitore di chiavi con il nome specificato non esiste, ne viene creato uno e la chiave viene resa persistente. Se invece esiste, la chiave presente nel contenitore viene caricata automaticamente nell'oggetto AsymmetricAlgorithm. Di conseguenza, la parte di codice nel metodo GenKey_SaveInContainer rende persistente la chiave perché viene eseguita per prima, mentre la parte di codice nel metodo GetKeyFromContainer carica la chiave perché viene eseguita successivamente.

Imports System
Imports System.IO
Imports System.Security.Cryptography
 _

Public Class StoreKey

    Public Shared Sub Main()
        Try
            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")

            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        End Try
    End Sub

    Public Shared Sub GenKey_SaveInContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        ' name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

        ' Display the key information to the console.
        Console.WriteLine("Key added to container:  {0}", rsa.ToXmlString(True))
    End Sub

    Public Shared Sub GetKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

        ' Display the key information to the console.
        Console.WriteLine("Key retrieved from container : {0}", rsa.ToXmlString(True))
    End Sub

    Public Shared Sub DeleteKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container.
        Dim rsa As New RSACryptoServiceProvider(cp)

        ' Delete the key entry in the container.
        rsa.PersistKeyInCsp = False

        ' Call Clear to release resources and delete the key from the container.
        rsa.Clear()

        Console.WriteLine("Key deleted.")
    End Sub
End Class
using System;
using System.IO;
using System.Security.Cryptography;

public class StoreKey

{
    public static void Main()
    {
        try
        {
            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");
            
            // Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer");
    
            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");

            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");

            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }

    }

    public static void GenKey_SaveInContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

        // Display the key information to the console.
        Console.WriteLine("Key added to container: \n  {0}", rsa.ToXmlString(true));
    }

    public static void GetKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

        // Display the key information to the console.
        Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
    }

    public static void DeleteKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

        // Delete the key entry in the container.
        rsa.PersistKeyInCsp = false;

        // Call Clear to release resources and delete the key from the container.
        rsa.Clear();

        Console.WriteLine("Key deleted.");
    }
}
      

Vedere anche

Concetti

Generazione di chiavi per crittografia e decrittografia

Crittografia dei dati

Decrittografia di dati

Servizi di crittografia

Altre risorse

Attività di crittografia