Model kryptografii .NET
Program .NET udostępnia implementacje wielu standardowych algorytmów kryptograficznych, a model kryptografii .NET jest rozszerzalny.
Dziedziczenie obiektów
System kryptografii .NET implementuje rozszerzalny wzorzec dziedziczenia klasy pochodnej. Hierarchia jest następująca:
Klasa typu algorytmu, taka jak SymmetricAlgorithm, AsymmetricAlgorithmlub HashAlgorithm. Ten poziom jest abstrakcyjny.
Klasa algorytmu dziedzicząca z klasy typu algorytmu; na przykład , AesRSAlub ECDiffieHellman. Ten poziom jest abstrakcyjny.
Implementacja klasy algorytmu, która dziedziczy z klasy algorytmu; na przykład , AesManagedRC2CryptoServiceProviderlub ECDiffieHellmanCng. Ten poziom jest w pełni zaimplementowany.
Ten wzorzec klas pochodnych umożliwia dodanie nowego algorytmu lub nowej implementacji istniejącego algorytmu. Aby na przykład utworzyć nowy algorytm klucza publicznego, należy dziedziczyć z AsymmetricAlgorithm klasy . Aby utworzyć nową implementację określonego algorytmu, należy utworzyć nie abstrakcyjną klasę pochodną tego algorytmu.
Jak są implementowane algorytmy na .NET
Jako przykład różnych implementacji dostępnych dla algorytmu należy wziąć pod uwagę algorytmy symetryczne. Podstawą dla wszystkich algorytmów symetrycznych jest SymmetricAlgorithm, który jest dziedziczony przez Aes, TripleDESi inne, które nie są już zalecane.
Aes Jest dziedziczone przez AesCryptoServiceProvider, AesCngi AesManaged.
W .NET Framework na Windows:
*CryptoServiceProvider
Klasy algorytmów, takie jak AesCryptoServiceProvider, są otoką Windows implementacji algorytmu interfejsu API kryptografii (CAPI).*Cng
Klasy algorytmów, takie jak ECDiffieHellmanCng, są otoką Windows Kryptografia nowej generacji (CNG).*Managed
Klasy, takie jak AesManaged, są pisane w całości w kodzie zarządzanym.*Managed
Implementacje nie są certyfikowane przez Federal Information Processing Standards (FIPS) i mogą być wolniejsze niż*CryptoServiceProvider
klasy otoki*Cng
i .
W programach .NET Core i .NET 5 i nowszych wszystkie klasy implementacji (*CryptoServiceProvider
, *Managed
i *Cng
) są otokami algorytmów systemu operacyjnego. Jeśli algorytmy systemu operacyjnego mają certyfikat FIPS, program .NET używa algorytmów certyfikowanych przez fips. Aby uzyskać więcej informacji, zobacz Kryptografia międzyplatformowa.
W większości przypadków nie trzeba bezpośrednio odwoływać się do klasy implementacji algorytmu, takiej jak AesCryptoServiceProvider
. Zwykle potrzebne metody i właściwości znajdują się w klasie algorytmu podstawowego, takiej jak Aes
. Utwórz wystąpienie domyślnej klasy implementacji przy użyciu metody fabryki w klasie algorytmu podstawowego i odwołaj się do klasy algorytmu podstawowego. Na przykład zobacz wyróżniony wiersz kodu w poniższym przykładzie:
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
Konfiguracja kryptograficzna
Konfiguracja kryptograficzna umożliwia określenie konkretnej implementacji algorytmu jako nazwy algorytmu, co pozwala rozszerzać klasy kryptografii .NET. Możesz dodać własną implementację sprzętu lub oprogramowania algorytmu i zamapować implementację na nazwę wybranego algorytmu. Jeśli algorytm nie zostanie określony w pliku konfiguracji, zostaną użyte ustawienia domyślne.
Wybieranie algorytmu
Algorytm można wybrać z różnych powodów: na przykład w celu zachowania integralności danych, zachowania poufności danych lub wygenerowania klucza. Algorytmy symetryczne i algorytmy wyznaczania wartości skrótu są przeznaczone do ochrony danych ze względu na integralność (ochronę przed zmianą) lub ze względów prywatności (ochrona przed wyświetlaniem). Algorytmy wyznaczania wartości skrótu są używane głównie w celu zapewnienia integralności danych.
Oto lista zalecanych algorytmów według aplikacji:
- Prywatność danych:
- Integralność danych:
- Podpis cyfrowy:
- Wymiana kluczy:
- Generowanie liczb losowych:
- Generowanie klucza na pomocą hasła: