Verileri şifreleme
Simetrik şifreleme ve asimetrik şifreleme farklı işlemler kullanılarak gerçekleştirilir. Simetrik şifreleme akışlarda gerçekleştirilir ve bu nedenle büyük miktarda veriyi şifrelemek için yararlıdır. Asimetrik şifreleme az sayıda bayt üzerinde gerçekleştirilir ve bu nedenle yalnızca az miktarda veri için yararlıdır.
Simetrik şifreleme
Yönetilen simetrik şifreleme sınıfları, akışa okunan verileri şifreleyen adlı özel bir CryptoStream akış sınıfıyla kullanılır. CryptoStream sınıfı yönetilen bir akış sınıfı, arabirimi uygulayan ICryptoTransform bir sınıf (şifreleme algoritması uygulayan bir sınıftan oluşturulur) ve CryptoStream'e izin verilen erişim türünü açıklayan bir CryptoStreamMode numaralandırma ile başlatılır. CryptoStream sınıfı, , MemoryStreamve NetworkStreamdahil olmak üzere FileStreamsınıfından Stream türetilen herhangi bir sınıf kullanılarak başlatılabilir. Bu sınıfları kullanarak çeşitli akış nesnelerinde simetrik şifreleme gerçekleştirebilirsiniz.
Aşağıdaki örnekte algoritma için varsayılan uygulama sınıfının yeni bir örneğinin nasıl oluşturulacağı gösterilmektedir Aes . Örneği bir CryptoStream sınıfında şifreleme gerçekleştirmek için kullanılır. Bu örnekte CryptoStream, herhangi bir yönetilen akış türü olabilecek adlı fileStream
bir akış nesnesiyle başlatılır. Aes sınıfından CreateEncryptor yöntemine şifreleme için kullanılan anahtar ve IV geçirilir. Bu durumda, öğesinden aes
oluşturulan varsayılan anahtar ve IV kullanılır.
Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
fileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
fileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write);
Bu kod yürütüldükten sonra CryptoStream nesnesine yazılan tüm veriler AES algoritması kullanılarak şifrelenir.
Aşağıdaki örnekte akış oluşturma, akışı şifreleme, akışa yazma ve akışı kapatma işlemlerinin tamamı gösterilmektedir. Bu örnek CryptoStream sınıfı ve Aes sınıfı kullanılarak şifrelenmiş bir dosya akışı oluşturur. Oluşturulan IV, başlangıcına FileStreamyazılır, böylece şifre çözme için okunabilir ve kullanılabilir. Ardından, sınıfıyla StreamWriter şifrelenmiş akışa bir ileti yazılır. Verileri şifrelemek ve şifresini çözmek için aynı anahtar birden çok kez kullanılabilir ancak her seferinde yeni bir rastgele IV oluşturulması önerilir. Bu şekilde, düz metin aynı olsa bile şifrelenmiş veriler her zaman farklıdır.
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
Kod, AES simetrik algoritmasını kullanarak akışı şifreler ve IV yazar ve ardından akışa "Merhaba Dünya!" kodunu şifreler. Kod başarılı olursa, TestData.txt adlı şifrelenmiş bir dosya oluşturur ve konsolda aşağıdaki metni görüntüler:
The file was encrypted.
Verilerin Şifresini Çözme'deki simetrik şifre çözme örneğini kullanarak dosyanın şifresini çözebilirsiniz. Bu örnek ve bu örnek aynı anahtarı belirtir.
Ancak özel durum oluşursa kod konsolda aşağıdaki metni görüntüler:
The encryption failed.
Asimetrik şifreleme
Asimetrik algoritmalar genellikle simetrik anahtarın şifrelenmesi ve IV gibi az miktarda veriyi şifrelemek için kullanılır. Genellikle asimetrik şifreleme gerçekleştiren bir kişi, başka bir taraf tarafından oluşturulan ortak anahtarı kullanır. sınıfı RSA bu amaçla .NET tarafından sağlanır.
Aşağıdaki örnek, simetrik anahtarı ve IV'yi şifrelemek için ortak anahtar bilgilerini kullanır. Üçüncü bir tarafın ortak anahtarını temsil eden iki bayt dizisi başlatılır. Bir RSAParameters nesne bu değerlere başlatılır. Ardından, RSAParameters nesnesi (temsil ettiği ortak anahtarla birlikte) yöntemi kullanılarak bir RSA örneğine RSA.ImportParameters içeri aktarılır. Son olarak, bir Aes sınıf tarafından oluşturulan özel anahtar ve IV şifrelenir. Bu örnek, sistemlerin 128 bit şifreleme yüklü olmasını gerektirir.
Imports System
Imports System.Security.Cryptography
Module Module1
Sub Main()
'Initialize the byte arrays to the public key information.
Dim modulus As Byte() = {214, 46, 220, 83, 160, 73, 40, 39, 201, 155, 19, 202, 3, 11, 191, 178, 56, 74, 90, 36, 248, 103, 18, 144, 170, 163, 145, 87, 54, 61, 34, 220, 222, 207, 137, 149, 173, 14, 92, 120, 206, 222, 158, 28, 40, 24, 30, 16, 175, 108, 128, 35, 230, 118, 40, 121, 113, 125, 216, 130, 11, 24, 90, 48, 194, 240, 105, 44, 76, 34, 57, 249, 228, 125, 80, 38, 9, 136, 29, 117, 207, 139, 168, 181, 85, 137, 126, 10, 126, 242, 120, 247, 121, 8, 100, 12, 201, 171, 38, 226, 193, 180, 190, 117, 177, 87, 143, 242, 213, 11, 44, 180, 113, 93, 106, 99, 179, 68, 175, 211, 164, 116, 64, 148, 226, 254, 172, 147}
Dim exponent As Byte() = {1, 0, 1}
'Create values to store encrypted symmetric keys.
Dim encryptedSymmetricKey() As Byte
Dim encryptedSymmetricIV() As Byte
'Create a new instance of the default RSA implementation class.
Dim rsa As RSA = RSA.Create()
'Create a new instance of the RSAParameters structure.
Dim rsaKeyInfo As New RSAParameters()
'Set rsaKeyInfo to the public key values.
rsaKeyInfo.Modulus = modulus
rsaKeyInfo.Exponent = exponent
'Import key parameters into rsa
rsa.ImportParameters(rsaKeyInfo)
'Create a new instance of the default Aes implementation class.
Dim aes As Aes = Aes.Create()
'Encrypt the symmetric key and IV.
encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)
encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1)
End Sub
End Module
using System;
using System.Security.Cryptography;
class Class1
{
static void Main()
{
//Initialize the byte arrays to the public key information.
byte[] modulus =
{
214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
106,99,179,68,175,211,164,116,64,148,226,254,172,147
};
byte[] exponent = { 1, 0, 1 };
//Create values to store encrypted symmetric keys.
byte[] encryptedSymmetricKey;
byte[] encryptedSymmetricIV;
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();
//Create a new instance of the RSAParameters structure.
RSAParameters rsaKeyInfo = new RSAParameters();
//Set rsaKeyInfo to the public key values.
rsaKeyInfo.Modulus = modulus;
rsaKeyInfo.Exponent = exponent;
//Import key parameters into rsa.
rsa.ImportParameters(rsaKeyInfo);
//Create a new instance of the default Aes implementation class.
Aes aes = Aes.Create();
//Encrypt the symmetric key and IV.
encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1);
encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1);
}
}