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:

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:

  • *CryptoServiceProviderKlasy algorytmów, takie jak AesCryptoServiceProvider, są otoką Windows implementacji algorytmu interfejsu API kryptografii (CAPI).
  • *CngKlasy 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, *Managedi *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:

Zobacz też