Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET stellt Implementierungen vieler standardmäßiger Kryptografiealgorithmen bereit.
Objektvererbung
Das .NET-Kryptografiesystem implementiert ein erweiterbares Muster der abgeleiteten Klassenvererbung. Die Hierarchie lautet wie folgt:
Algorithmustypklasse, wie SymmetricAlgorithm, AsymmetricAlgorithm oder HashAlgorithm. Diese Ebene ist abstrakt.
Algorithmusklasse, die von einer Algorithmustypklasse erbt, z. B. Aes, RSA oder ECDiffieHellman. Diese Ebene ist abstrakt.
Implementierung einer Algorithmusklasse, die von einer Algorithmusklasse erbt, AesManagedz. B. , , RC2CryptoServiceProvideroder ECDiffieHellmanCng. Diese Stufe ist vollständig implementiert.
Mit diesem Muster abgeleiteter Klassen können Sie einen neuen Algorithmus oder eine neue Implementierung eines vorhandenen Algorithmus hinzufügen. Um beispielsweise einen neuen Public Key-Algorithmus zu erstellen, würden Sie von der AsymmetricAlgorithm Klasse erben. Um eine neue Implementierung eines bestimmten Algorithmus zu erstellen, erstellen Sie eine nicht abstrakte abgeleitete Klasse dieses Algorithmus.
In Zukunft wird dieses Vererbungsmodell nicht für neue primitive Datentypen wie AesGcm oder Shake128 verwendet. Diese Algorithmen sind sealed. Wenn Sie ein Erweiterbarkeitsmuster oder eine Abstraktion über diese Typen benötigen, liegt die Implementierung der Abstraktion in der Verantwortung des Entwicklers.
Einmal-APIs
Ab .NET 5 wurden einfachere APIs für Hashing und HMAC eingeführt. Diese One-Shot-APIs sind zwar etwas weniger flexibel:
- Sind einfacher zu verwenden (und weniger anfällig für Missbrauch)
- Sie reduzieren Zuteilungen oder sind zuordnungsfrei.
- Sie sind threadsicher.
- Verwenden der besten verfügbaren Implementierung für die Plattform
Die Hashing- und HMAC-Primitiven machen eine Einmal-API über eine statische HashData-Methode für den Typ verfügbar, z. B. SHA256.HashData. Die statischen APIs bieten keinen integrierten Erweiterungsmechanismus. Wenn Sie Ihre eigenen Algorithmen implementieren, empfiehlt es sich, auch ähnliche statische APIs des Algorithmus anzubieten.
Die RandomNumberGenerator Klasse bietet auch statische Methoden zum Erstellen oder Ausfüllen von Puffern mit kryptografischen Zufallsdaten. Diese Methoden verwenden immer den kryptografisch sicheren Pseudorandom-Zahlengenerator (CSPRNG) des Systems.
Implementierung von Algorithmen in .NET
Betrachten Sie als Beispiel für die verschiedenen Implementierungen, die für einen Algorithmus verfügbar sind, symmetrische Algorithmen. Die Basis für alle symmetrischen Algorithmen ist SymmetricAlgorithm, die von Aes, TripleDESund anderen geerbt wird, die nicht mehr empfohlen werden.
Aes wird von AesCryptoServiceProvider, AesCng, und AesManaged geerbt.
In .NET Framework unter Windows:
*CryptoServiceProviderAlgorithmusklassen wie AesCryptoServiceProvider sind Wrapper um die Implementierung der Windows-Kryptografie-API (CAPI) eines Algorithmus.*CngAlgorithmusklassen, wie ECDiffieHellmanCng, sind Wrapper für die Implementierung von Windows Cryptography Next Generation (CNG).*ManagedKlassen, wie beispielsweise AesManaged, werden vollständig in verwaltetem Code geschrieben.*ManagedImplementierungen sind nicht von den Federal Information Processing Standards (FIPS) zertifiziert und können langsamer als die*CryptoServiceProviderKlassen und*CngWrapperklassen sein.
In .NET Core und .NET 5 und höheren Versionen sind alle Implementierungsklassen (*CryptoServiceProvider, *Managed, und *Cng) Wrapper für die Algorithmen des Betriebssystems. 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 wie AesCryptoServiceProvider verweisen. Die Methoden und Eigenschaften, die Sie normalerweise benötigen, befinden sich in der Basisalgorithmusklasse, wie Aes. Erstellen Sie eine Instanz einer Standardimplementierungsklasse mithilfe einer Factorymethode für die Basisalgorithmusklasse, und verweisen Sie auf die Basisalgorithmusklasse. Sehen Sie sich beispielsweise die hervorgehobene Codezeile im folgenden Beispiel an:
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))
{
// By default, the StreamWriter uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamWriter(cryptoStream, Encoding.Unicode).
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)
' By default, the StreamWriter uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamWriter(cryptoStream, Encoding.Unicode).
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
Auswählen eines Algorithmus
Sie können einen Algorithmus aus unterschiedlichen Gründen auswählen: z. B. für die Datenintegrität, für den Datenschutz oder zum Generieren eines Schlüssels. Symmetrische und Hashalgorithmen sind für den Schutz von Daten aus Gründen der Integrität (Schutz vor Änderung) oder Datenschutzgründen (Schutz vor Anzeige) vorgesehen. Hashalgorithmen werden hauptsächlich für die Datenintegrität verwendet.
Hier ist eine Liste der empfohlenen Algorithmen nach Anwendung:
- Datenschutz:
- Datenintegrität:
- Digitale Signatur:
- Schlüsselaustausch:
- Zufallszahlengenerierung:
- Generieren eines Schlüssels aus einem Kennwort: