Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET, birçok standart şifreleme algoritmasının uygulamalarını sağlar.
Nesne devralma
.NET kriptografi sistemi, genişletilebilir bir türetilmiş sınıf kalıtım deseni uygular. Hiyerarşi aşağıdaki gibidir:
Algoritma türü sınıfı, örneğin SymmetricAlgorithm, , AsymmetricAlgorithmveya HashAlgorithm. Bu düzey soyut.
Bir algoritma türü sınıfından devralan algoritma sınıfı, örneğin, Aes, RSAveya ECDiffieHellman. Bu düzey soyut.
Örneğin, AesManaged, RC2CryptoServiceProvider veya ECDiffieHellmanCng gibi bir algoritma sınıfından devralan bir algoritma sınıfının uygulanması. Bu düzey tam olarak uygulanır.
Türetilmiş sınıfların bu deseni, yeni bir algoritma veya var olan bir algoritmanın yeni bir uygulamasını eklemenize olanak tanır. Örneğin, yeni bir ortak anahtar algoritması oluşturmak için AsymmetricAlgorithm sınıfından devralarak bir sınıf oluşturursunuz. Belirli bir algoritmanın yeni bir uygulamasını oluşturmak için bu algoritmanın soyut olmayan türetilmiş bir sınıfını oluşturursunuz.
Bundan sonra, bu devralma modeli AesGcm veya Shake128 gibi yeni temel öğe türleri için kullanılmayacaktır. Bu algoritmalar şeklindedir sealed. Bu türler üzerinde genişletilebilirlik deseni veya soyutlama gerekiyorsa, soyutlamanın uygulanması geliştiricinin sorumluluğundadır.
Tek seferlik API'ler
.NET 5'den başlayarak karma oluşturma ve HMAC için daha basit API'ler kullanıma sunulmuştur. Biraz daha az esnek olsa da, bu tek seferlik API'ler:
- Kullanımı daha kolay (ve kötüye kullanıma daha az eğilimli)
- Ayırımları azaltma veya ayırımsız olma
- İş parçacığı güvenli mi?
- Platform için kullanılabilir en iyi uygulamayı kullanma
Karma ve HMAC işlevleri, türündeki statik HashData yöntemi aracılığıyla tek kullanımda bir API'yi sunmaktadır, örneğin SHA256.HashData. Statik API'ler yerleşik genişletilebilirlik mekanizması sunmaz. Kendi algoritmalarınızı uyguluyorsanız, algoritmanın benzer statik API'lerini de sunmanız önerilir.
RandomNumberGenerator sınıfı, şifreleme için rastgele verilerle arabellek oluşturmak veya doldurmak için kullanılan statik yöntemler de sunar. Bu yöntemler her zaman sistemin kriptografik olarak güvenli pseudorandom sayı oluşturucusunu (CSPRNG) kullanır.
Algoritmalar .NET'te nasıl uygulanır?
Bir algoritma için kullanılabilen farklı uygulamalara örnek olarak simetrik algoritmaları göz önünde bulundurun. Tüm simetrik algoritmaların temeli SymmetricAlgorithm olup, bu yapı Aes, TripleDES ve artık önerilmeyen diğer algoritmalar tarafından devralınmıştır.
Aes, AesCryptoServiceProvider, AesCng ve AesManaged tarafından devralınır.
Windows üzerinde .NET Framework'te:
-
*CryptoServiceProvidergibi AesCryptoServiceProvideralgoritma sınıfları, bir algoritmanın Windows Şifreleme API'sinin (CAPI) uygulamasının etrafındaki sarmalayıcılardır. -
*Cnggibi ECDiffieHellmanCngalgoritma sınıfları, Windows Cryptography Next Generation (CNG) uygulamasının etrafındaki sarmalayıcılardır. -
*Managedgibi AesManagedsınıflar tamamen yönetilen kodda yazılır.*Manageduygulamaları Federal Bilgi İşleme Standartları (FIPS) tarafından onaylanmamıştır ve*CryptoServiceProviderve*Cngsarmalayıcı sınıflarına göre daha yavaş olabilir.
.NET Core ve .NET 5 ve sonraki sürümlerinde, tüm uygulama sınıfları (*CryptoServiceProvider, *Managedve *Cng) işletim sistemi (OS) algoritmaları için sarmalayıcılardır. İşletim sistemi algoritmaları FIPS sertifikalıysa, .NET FIPS sertifikalı algoritmalar kullanır. Daha fazla bilgi için bkz. Platformlar Arası Şifreleme.
Çoğu durumda, gibi AesCryptoServiceProviderbir algoritma uygulama sınıfına doğrudan başvurmanız gerekmez. Normalde ihtiyacınız olan yöntemler ve özellikler gibi Aestemel algoritma sınıfındadır. Temel algoritma sınıfında bir fabrika yöntemi kullanarak varsayılan uygulama sınıfının bir örneğini oluşturun ve temel algoritma sınıfına başvurun. Örneğin, aşağıdaki örnekte vurgulanan kod satırına bakın:
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
Algoritma seçme
Algoritmayı farklı nedenlerle seçebilirsiniz: örneğin, veri bütünlüğü, veri gizliliği veya bir anahtar oluşturmak için. Simetrik ve karma algoritmalar, bütünlük nedenleriyle (değişiklikten koruma) veya gizlilik nedenleriyle (görüntülemeye karşı koruma) verileri korumaya yöneliktir. Karma algoritmalar öncelikle veri bütünlüğü için kullanılır.
Uygulamaya göre önerilen algoritmaların listesi aşağıdadır:
- Veri gizliliği:
- Veri bütünlüğü:
- Dijital imza:
- Anahtar değişimi:
- Rastgele sayı oluşturma:
- Paroladan anahtar oluşturma: