Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
.NET poskytuje implementace mnoha standardních kryptografických algoritmů.
Dědičnost objektů
Kryptografický systém .NET implementuje rozšiřitelný vzor dědičnosti odvozené třídy. Hierarchie je následující:
Třída typu algoritmu, například SymmetricAlgorithm, AsymmetricAlgorithmnebo HashAlgorithm. Tato úroveň je abstraktní.
Třída algoritmu, která dědí z třídy typu algoritmu, Aesnapříklad , RSAnebo ECDiffieHellman. Tato úroveň je abstraktní.
Implementace třídy algoritmu, která dědí z třídy algoritmu, například AesManaged, RC2CryptoServiceProvider nebo ECDiffieHellmanCng. Tato úroveň je plně implementována.
Tento model odvozených tříd umožňuje přidat nový algoritmus nebo novou implementaci existujícího algoritmu. Například k vytvoření nového algoritmu veřejného klíče byste dědili z AsymmetricAlgorithm třídy. Chcete-li vytvořit novou implementaci konkrétního algoritmu, vytvoříte ne abstraktní odvozenou třídu tohoto algoritmu.
V budoucnu se tento model dědičnosti nepoužívá pro nové druhy primitiv jako AesGcm nebo Shake128. Tyto algoritmy jsou sealed. Pokud u těchto typů potřebujete vzor rozšiřitelnosti nebo abstrakci, je implementace abstrakce zodpovědností vývojáře.
Jednorázové rozhraní API
Od .NET 5 se pro hashování a HMAC zavedla jednodušší rozhraní API. I když jsou o něco méně flexibilní, tato jednorázová rozhraní API:
- Je jednodušší používat (a méně náchylné k zneužití)
- Snížit přidělení nebo fungovat bez přidělení
- Jsou vlákno bezpečné
- Použití nejlepší dostupné implementace pro platformu
Primitiva pro hashování a HMAC zpřístupňují jednorázové rozhraní API pomocí statické metody typu, jako je HashData. Statická rozhraní API nenabízí žádný integrovaný mechanismus rozšiřitelnosti. Pokud implementujete vlastní algoritmy, doporučujeme nabídnout podobná statická rozhraní API tohoto algoritmu.
Třída RandomNumberGenerator také nabízí statické metody pro vytváření nebo vyplňování vyrovnávacích pamětí kryptografickými náhodnými daty. Tyto metody vždy používají kryptograficky zabezpečený pseudorandomní generátor čísel systému (CSPRNG).
Způsob implementace algoritmů v .NET
Jako příklad různých implementací dostupných pro algoritmus zvažte symetrické algoritmy. Základem pro všechny symetrické algoritmy je SymmetricAlgorithm, ze kterého vycházejí Aes, TripleDES a další, které se již nedoporučují.
Aes je zděděna pomocí AesCryptoServiceProvider, AesCnga AesManaged.
V rámci .NET Framework ve Windows:
-
*CryptoServiceProviderTřídy algoritmů, například AesCryptoServiceProvider, jsou obálky kolem implementace rozhraní API kryptografie systému Windows (CAPI) algoritmu. -
*CngTřídy algoritmů, například ECDiffieHellmanCng, jsou obálky kolem implementace CNG (Windows Cryptography Next Generation). -
*Managedtřídy, například AesManaged, jsou napsány zcela ve spravovaném kódu.*Managedimplementace nejsou certifikovány federálními standardy pro zpracování informací (FIPS) a mohou být pomalejší než obalové třídy*CryptoServiceProvidera*Cng.
V .NET Core a .NET 5 a novějších verzích jsou všechny třídy implementace (*CryptoServiceProvider*Managed, a*Cng) obálky pro algoritmy operačního systému (OS). Pokud jsou algoritmy operačního systému certifikované standardem FIPS, pak .NET používá algoritmy s certifikací FIPS. Další informace naleznete v tématu Kryptografie pro různé platformy.
Ve většině případů nemusíte přímo odkazovat na třídu implementace algoritmu, například AesCryptoServiceProvider. Metody a vlastnosti, které obvykle potřebujete, jsou na základní třídě algoritmu, například Aes. Vytvořte instanci výchozí implementační třídy pomocí tovární metody v základní třídě algoritmu a odkazujte na základní třídu algoritmu. Podívejte se například na zvýrazněný řádek kódu v následujícím příkladu:
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
Volba algoritmu
Můžete vybrat algoritmus z různých důvodů: například pro integritu dat, ochranu osobních údajů nebo vygenerovat klíč. Symetrické a hashovací algoritmy jsou určeny k ochraně dat z důvodů integrity (ochrana před změnou) nebo z důvodů ochrany osobních údajů (ochrana před zobrazením). Algoritmy hash se používají především pro integritu dat.
Tady je seznam doporučených algoritmů podle aplikace:
- Ochrana osobních údajů
- Integrita dat:
- Digitální podpis:
- Výměna klíčů:
- Generování náhodných čísel:
- Generování klíče z hesla: