Sdílet prostřednictvím


Postupy: Uložení asymetrického klíče v kontejneru klíčů

Asymetrické soukromé klíče by nikdy neměly být uloženy doslovně nebo ve formátu prostého textu v místním počítači. Pokud potřebujete uložit privátní klíč, měli byste použít kontejner klíčů. Další informace o kontejnerech klíčů naleznete v Seznámení s kontejnery klíčů RSA na úrovni počítače a na úrovni uživatele.

Pro vytvoření asymetrického klíče a jeho uložení v kontejneru klíčů udělejte následující

  1. Vytvořte novou instanci třídy CspParameters a položce CspParameters.KeyContainerName předejte název pro kontejner klíčů.

  2. Vytvořte novou instanci třídy, která je odvozena z třídy AsymmetricAlgorithm (obvykle RSACryptoServiceProvider nebo DSACryptoServiceProvider) a jeho konstruktoru předejte již dříve vytvořený objekt CspParameters.

Pokud chcete odstranit klíč z kontejneru klíčů

  1. Vytvořte novou instanci třídy CspParameters a položce CspParameters.KeyContainerName předejte název pro kontejner klíčů.

  2. Vytvořte novou instanci třídy, která je odvozena z třídy AsymmetricAlgorithm (obvykle RSACryptoServiceProvider nebo DSACryptoServiceProvider) a jeho konstruktoru předejte již dříve vytvořený objekt CspParameters.

  3. Nastavte vlastnost PersistKeyInCSP, která náleží třídě odvozené z AsymmetricAlgorithm na hodnotu false (False v jazyce Visual Basic).

  4. Zavolejte metodu Clear, která náleží třídě odvozené z AsymmetricAlgorithm. Tato metoda uvolní všechny prostředky třídy a vyčistí kontejner klíčů.

Příklad

Následující příklad ukazuje, jak vytvořit asymetrický klíč, uložit ho do kontejneru klíčů, jeho pozdější získání a odstranění klíče z kontejneru.

Všimněte si, že kód metody GenKey_SaveInContainer a metody GetKeyFromContainer je podobný. Když specifikujete název kontejneru klíčů u objektu CspParameters a předáváte ho objektu AsymmetricAlgorithm s vlastností PersistKeyInCsp nebo s vlastností PersistKeyInCsp nastavenou na hodnotu true, stane se následující. Pokud kontejner klíčů se zadaným názvem neexistuje, pak je jeden vytvořen a klíč je uchován. Pokud kontejner klíčů se zadaným názvem existuje, pak klíč v kontejneru je automaticky načten do aktuálního objektu AsymmetricAlgorithm. Proto kód v metodě GenKey_SaveInContainer uchovává klíč, protože je spuštěn jako první, zatímco kód v metodě GetKeyFromContainer načítá klíč, protože je spuštěn jako druhý.

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.");
    }
}
      

Viz také

Koncepty

Generování klíčů pro šifrování a dešifrování

Šifrování dat

Dešifrování dat

Služby šifrování

Další zdroje

Kryptografické úlohy