Sdílet prostřednictvím


Dešifrování dat

Dešifrování je reverzní operace šifrování. Pro šifrování tajných klíčů musíte znát klíč i IV, které se použily k šifrování dat. Pro šifrování veřejného klíče musíte znát veřejný klíč (pokud byla data šifrovaná pomocí privátního klíče) nebo privátní klíč (pokud byla data šifrovaná pomocí veřejného klíče).

Symetrické dešifrování

Dešifrování dat šifrovaných pomocí symetrických algoritmů se podobá procesu použitému k šifrování dat pomocí symetrických algoritmů. Třída CryptoStream se používá se symetrickými kryptografickými třídami poskytovanými rozhraním .NET k dešifrování dat načtených z libovolného objektu spravovaného datového proudu.

Následující příklad ukazuje, jak vytvořit novou instanci výchozí třídy implementace pro Aes algoritmus. Instance se používá k dešifrování objektu CryptoStream . Tento příklad nejprve vytvoří novou instanci Aes třídy implementace. Přečte hodnotu inicializačního vektoru (IV) z proměnné fileStreamspravovaného datového proudu . Dále vytvoří instanci objektu CryptoStream a inicializuje ho fileStream na hodnotu instance. Metoda SymmetricAlgorithm.CreateDecryptor z Aes instance se předává hodnotu IV a stejný klíč, který byl použit pro šifrování.

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

Následující příklad ukazuje celý proces vytvoření datového proudu, dešifrování datového proudu, čtení z datového proudu a zavření datových proudů. Vytvoří se objekt datového proudu souboru, který načte soubor s názvem TestData.txt. Stream souboru se pak dešifruje pomocí CryptoStream třídy a třídy Aes . Tento příklad určuje hodnotu klíče, která se používá v příkladu symetrického šifrování pro šifrování dat. Nezobrazuje kód potřebný k šifrování a přenosu těchto hodnot.

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

Předchozí příklad používá stejný klíč a algoritmus použitý v příkladu symetrického šifrování pro Šifrování dat. Dešifruje TestData.txt soubor vytvořený v tomto příkladu a zobrazí původní text v konzole.

Asymetrické dešifrování

Strana A obvykle vygeneruje veřejný i privátní klíč a uloží ho buď v paměti, nebo v kontejneru kryptografických klíčů. Strana A pak odešle veřejný klíč jiné straně (strana B). Pomocí veřejného klíče strana B šifruje data a odesílá data zpět straně A. Po přijetí dat je strana A dešifruje pomocí privátního klíče, který odpovídá. Dešifrování bude úspěšné pouze v případě, že strana A používá privátní klíč, který odpovídá straně veřejného klíče B sloužící k šifrování dat.

Informace o tom, jak uložit asymetrický klíč v zabezpečeném kontejneru kryptografických klíčů a jak později načíst asymetrický klíč, najdete v tématu Postupy: Ukládání asymetrických klíčů v kontejneru klíčů.

Následující příklad ukazuje dešifrování dvou polí bajtů, které představují symetrický klíč a IV. Informace o tom, jak extrahovat asymetrický veřejný klíč z objektu RSA ve formátu, který můžete snadno odeslat třetí straně, najdete v tématu Šifrování dat.

'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);

Viz také