Verilerin şifresini çözme
Şifre çözme, şifrelemenin ters işlemidir. Gizli anahtar şifrelemesi için, verileri şifrelemek için kullanılan anahtarı ve IV'yi bilmeniz gerekir. Ortak anahtar şifrelemesi için ortak anahtarı (veriler özel anahtar kullanılarak şifrelendiyse) veya özel anahtarı (veriler ortak anahtar kullanılarak şifrelendiyse) bilmeniz gerekir.
Simetrik şifre çözme
Simetrik algoritmalarla şifrelenen verilerin şifresi, simetrik algoritmalarla verileri şifrelemek için kullanılan işleme benzer. sınıfı CryptoStream , yönetilen herhangi bir akış nesnesinden okunan verilerin şifresini çözmek için .NET tarafından sağlanan simetrik şifreleme sınıflarıyla birlikte kullanılır.
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 . Örnek, bir CryptoStream nesne üzerinde şifre çözme gerçekleştirmek için kullanılır. Bu örnek ilk olarak uygulama sınıfının yeni bir örneğini Aes oluşturur. Yönetilen akış değişkeninden fileStream
başlatma vektör (IV) değerini okur. Ardından bir CryptoStream nesne örneği oluşturur ve örneğin değerine fileStream
başlatır. SymmetricAlgorithm.CreateDecryptor Örnekten Aes yöntemine IV değeri ve şifreleme için kullanılan anahtar geçirilir.
Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);
Aşağıdaki örnekte akış oluşturma, akışın şifresini çözme, akıştan okuma ve akışları kapatma işlemlerinin tamamı gösterilmektedir. TestData.txt adlı bir dosyayı okuyan bir dosya akışı nesnesi oluşturulur. Daha sonra dosya akışının şifresi CryptoStream sınıfı ve Aes sınıfı kullanılarak çözülür. Bu örnek, Verileri Şifreleme için simetrik şifreleme örneğinde kullanılan anahtar değerini belirtir. Bu değerleri şifrelemek ve aktarmak için gereken kodu göstermez.
using System.Security.Cryptography;
try
{
using (FileStream fileStream = new("TestData.txt", FileMode.Open))
{
using (Aes aes = Aes.Create())
{
byte[] iv = new byte[aes.IV.Length];
int numBytesToRead = aes.IV.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fileStream.Read(iv, numBytesRead, numBytesToRead);
if (n == 0) break;
numBytesRead += n;
numBytesToRead -= n;
}
byte[] key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
};
using (CryptoStream cryptoStream = new(
fileStream,
aes.CreateDecryptor(key, iv),
CryptoStreamMode.Read))
{
// By default, the StreamReader uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamReader(cryptoStream, Encoding.Unicode).
using (StreamReader decryptReader = new(cryptoStream))
{
string decryptedMessage = await decryptReader.ReadToEndAsync();
Console.WriteLine($"The decrypted original message: {decryptedMessage}");
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"The decryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Module Module1
Sub Main()
' Decryption key must be the same value that was used
' to encrypt the stream.
Dim key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Try
' Create a file stream.
Using fileStream As New FileStream("TestData.txt", FileMode.Open)
' Create a new instance of the default Aes implementation class
Using aes As Aes = Aes.Create()
' Reads IV value from beginning of the file.
Dim iv As Byte() = New Byte(aes.IV.Length - 1) {}
Dim numBytesToRead As Integer = CType(aes.IV.Length, Integer)
Dim numBytesRead As Integer = 0
While (numBytesToRead > 0)
Dim n As Integer = fileStream.Read(iv, numBytesRead, numBytesToRead)
If n = 0 Then
Exit While
End If
numBytesRead += n
numBytesToRead -= n
End While
Using cryptoStream As New CryptoStream(fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
' By default, the StreamReader uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamReader(cryptoStream, Encoding.Unicode).
Using decryptReader As New StreamReader(cryptoStream)
' Display the message.
Console.WriteLine($"The decrypted original message: {decryptReader.ReadToEnd()}")
End Using
End Using
End Using
End Using
Catch
Console.WriteLine("The decryption Failed.")
Throw
End Try
End Sub
End Module
Yukarıdaki örnek, Verileri Şifreleme için simetrik şifreleme örneğinde kullanılan aynı anahtarı ve algoritmayı kullanır. Bu örnek tarafından oluşturulan TestData.txt dosyasının şifresini çözer ve özgün metni konsolda görüntüler.
Asimetrik şifre çözme
Genellikle, bir taraf (A partisi) hem ortak hem de özel anahtar oluşturur ve anahtarı bellekte veya şifreleme anahtarı kapsayıcısında depolar. Ardından A partisi ortak anahtarı başka bir tarafa (B partisi) gönderir. B grubu, ortak anahtarı kullanarak verileri şifreler ve verileri A grubuna geri gönderir. Verileri aldıktan sonra, A grubu karşılık gelen özel anahtarı kullanarak şifrelerini çözer. Şifre çözme işlemi ancak A tarafı verileri şifrelemek için kullanılan B Grubu ortak anahtarına karşılık gelen özel anahtarı kullandığında başarılı olur.
Asimetrik anahtarı güvenli şifreleme anahtarı kapsayıcısında depolama ve daha sonra asimetrik anahtarı alma hakkında bilgi için bkz . Nasıl yapılır: Asimetrik Anahtarları Anahtar Kapsayıcısında Depolama.
Aşağıdaki örnek, simetrik anahtarı ve IV'yi temsil eden iki bayt dizisinin şifresini gösterir. Nesneden RSA asimetrik ortak anahtarı üçüncü tarafa kolayca gönderebileceğiniz bir biçimde ayıklama hakkında bilgi için bkz . Verileri Şifreleme.
'Create a new instance of the RSA class.
Dim rsa As RSA = RSA.Create()
' Export the public key information and send it to a third party.
' Wait for the third party to encrypt some data and send it back.
'Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1)
symmetricIV = rsa.Decrypt(encryptedSymmetricIV, RSAEncryptionPadding.Pkcs1)
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();
// Export the public key information and send it to a third party.
// Wait for the third party to encrypt some data and send it back.
//Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1);
symmetricIV = rsa.Decrypt(encryptedSymmetricIV , RSAEncryptionPadding.Pkcs1);