.NET-Kryptografiemodell

.NET stellt Implementierungen vieler standardgrafischer Algorithmen bereit, und das .NET-Kryptografiemodell ist erweiterbar.

Objektvererbung

Das .NET-Kryptografiesystem implementiert ein erweiterbares Muster der abgeleiteten Klassenvererbung. Die Hierarchie lautet wie folgt:

Mit diesem Muster abgeleiteter Klassen können Sie einen neuen Algorithmus oder eine neue Implementierung eines vorhandenen Algorithmus hinzufügen. Möchten Sie z. B. einen neuen Algorithmus für einen öffentlichem Schlüssel erstellen, würden Sie von der AsymmetricAlgorithm-Klasse erben. Um eine neue Implementierung eines bestimmten Algorithmus zu erstellen, würden Sie eine nicht abstrakte abgeleitete Klasse dieses Algorithmus erstellen.

Implementierung von Algorithmen in .NET

Als ein Beispiel für die verschiedenen Implementierungen eines Algorithmus können Sie sich symmetrische Algorithmen ansehen. Die Basis für alle symmetrischen Algorithmen ist SymmetricAlgorithm, die von AesTripleDES, und anderen geerbt wird, die nicht mehr empfohlen werden.

Aes wird von AesCryptoServiceProvider, AesCng, und AesManaged.

In .NET Framework am Windows:

  • *CryptoServiceProviderAlgorithmusklassen, zAesCryptoServiceProvider. B. , sind Wrapper um die implementierung der Windows Kryptografie-API (CAPI) eines Algorithmus.
  • *CngAlgorithmusklassen, zECDiffieHellmanCng. B. , sind Wrapper rund um die Implementierung der Windows Kryptografie next Generation (CNG).
  • *Managed Klassen, z AesManaged. B. , werden vollständig in verwaltetem Code geschrieben. *Managed Implementierungen sind nicht von den Federal Information Processing Standards (FIPS) zertifiziert und können langsamer als die *CryptoServiceProvider Klassen und *Cng Wrapperklassen sein.

In .NET Core- und .NET 5- und höher-Versionen sind alle Implementierungsklassen (*CryptoServiceProvider, *Managedund *Cng) Wrapper für die Betriebssystemalgorithmen .NET Core und höher. Wenn die Betriebssystemalgorithmen FIPS-zertifiziert sind, verwendet .NET FIPS-zertifizierte Algorithmen. Weitere Informationen finden Sie unter Plattformübergreifende Kryptografie.

In den meisten Fällen müssen Sie nicht direkt auf eine Algorithmusimplementierungsklasse verweisen, z AesCryptoServiceProvider. B. . Die Methoden und Eigenschaften, die Sie in der Regel benötigen, befinden sich in der Basisalgorithmusklasse, z Aes. B. . Erstellen Sie eine Instanz einer Standardimplementierungsklasse mithilfe einer Factorymethode für die Basisalgorithmusklasse, und verweisen Sie auf die Basisalgorithmusklasse. Siehe z. B. die hervorgehobene Codezeile im folgenden Beispiel:

using System;
using System.IO;
using System.Security.Cryptography;

try
{
    using (FileStream fileStream = new("TestData.txt", FileMode.OpenOrCreate))
    {
        using (Aes aes = Aes.Create())
        {
            byte[] key =
            {
                0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
            };
            aes.Key = key;

            byte[] iv = aes.IV;
            fileStream.Write(iv, 0, iv.Length);

            using (CryptoStream cryptoStream = new(
                fileStream,
                aes.CreateEncryptor(),
                CryptoStreamMode.Write))
            {
                using (StreamWriter encryptWriter = new(cryptoStream))
                {
                    encryptWriter.WriteLine("Hello World!");
                }
            }
        }
    }

    Console.WriteLine("The file was encrypted.");
}
catch (Exception ex)
{
    Console.WriteLine($"The encryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        Try
            ' Create a file stream
            Using fileStream As New FileStream("TestData.txt", FileMode.OpenOrCreate)

                ' Create a new instance of the default Aes implementation class  
                ' and configure encryption key.
                Using aes As Aes = Aes.Create()
                    'Encryption key used to encrypt the stream.
                    'The same value must be used to encrypt and decrypt the stream.
                    Dim key As Byte() = {
                        &H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8,
                        &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16
                    }

                    aes.Key = key

                    ' Stores IV at the beginning of the file.
                    ' This information will be used for decryption.
                    Dim iv As Byte() = aes.IV
                    fileStream.Write(iv, 0, iv.Length)

                    ' Create a CryptoStream, pass it the FileStream, and encrypt
                    ' it with the Aes class.
                    Using cryptoStream As New CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write)

                        ' Create a StreamWriter for easy writing to the
                        ' file stream.
                        Using sWriter As New StreamWriter(cryptoStream)

                            'Write to the stream.
                            sWriter.WriteLine("Hello World!")
                        End Using
                    End Using
                End Using
            End Using

            'Inform the user that the message was written  
            'to the stream.  
            Console.WriteLine("The text was encrypted.")
        Catch
            'Inform the user that an exception was raised.  
            Console.WriteLine("The encryption failed.")
            Throw
        End Try
    End Sub
End Module

Kryptografische Konfiguration

Mit der kryptografischen Konfiguration können Sie eine bestimmte Implementierung eines Algorithmus auf einen Algorithmusnamen auflösen und die Erweiterbarkeit der .NET-Kryptografieklassen ermöglichen. Sie können Ihre eigene Hardware- oder Softwareimplementierung eines Algorithmus hinzufügen und die Implementierung dem von Ihnen gewählten Algorithmusnamen zuordnen. Ist in der Konfigurationsdatei kein Algorithmus angegeben, werden die Standardeinstellungen verwendet.

Auswählen eines Algorithmus

Sie können einen Algorithmus für unterschiedliche Zwecke wählen: z. B. für Datenintegrität, für Datenschutz oder zum Generieren eines Schlüssels. Symmetrische und Hashalgorithmen sind dazu vorgesehen, Daten entweder aus Integritätsgründen (Schutz vor Änderungen) oder aus Datenschutzgründen (Schutz vor Anzeigen) zu schützen. Hashalgorithmen werden hauptsächlich für die Datenintegrität verwendet.

Es folgt eine Liste empfohlener Algorithmen nach Anwendung:

Weitere Informationen