Aracılığıyla paylaş


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 fileStreambaş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);

Ayrıca bkz.