Compartilhar via


Como descriptografar dados

A descriptografia é a operação inversa da criptografia. Para criptografia de chave secreta, você deve saber a chave e a IV usadas para criptografar os dados. Para criptografia de chave pública, você deve saber a chave pública (se os dados foram criptografados usando a chave privada) ou a chave privada (se os dados foram criptografados usando a chave pública).

Descriptografia simétrica

A descriptografia de dados criptografados com algoritmos simétricos é semelhante ao processo usado para criptografar dados com algoritmos simétricos. A classe CryptoStream é usada com classes de criptografia simétricas fornecidas pelo .NET para descriptografar dados lidos de qualquer objeto de fluxo gerenciado.

O exemplo a seguir ilustra como criar uma instância da classe de implementação padrão para o algoritmo Aes. A instância é usada para executar a descriptografia em um objeto CryptoStream. Este exemplo primeiro cria uma instância da classe Aes de implementação. Ele lê o valor do vetor de inicialização (IV) de uma variável de fluxo gerenciado, fileStream. Então, ele instancia um objeto CryptoStream e o inicializa para o valor da instância fileStream. O método SymmetricAlgorithm.CreateDecryptor da instância Aes é passado o valor IV e a mesma chave que foi usada para criptografia.

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

O exemplo a seguir mostra todo o processo de criar, descriptografar, ler e fechar um fluxo. É criado um objeto de fluxo de arquivo que lê um arquivo chamado TestData.txt. O fluxo de arquivos é descriptografado usando a classe CryptoStream e a classe Aes. Este exemplo especifica o valor da chave usado no exemplo de criptografia simétrica para Criptografar Dados. Ele não mostra o código necessário para criptografar e transferir esses valores.

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

O exemplo anterior usa a mesma chave e algoritmo usados no exemplo de criptografia simétrica para Criptografar Dados. Ele descriptografa o arquivo TestData.txt criado por esse exemplo e exibe o texto original no console.

Descriptografia assimétrica

Normalmente, uma parte (parte A) gera uma chave pública e privada e armazena a chave na memória ou em um contêiner de chave de criptografia. A parte A então envia a chave pública para outra parte (parte B). Usando a chave pública, a parte B criptografa dados e envia os dados de volta para a parte A. Depois de receber os dados, a parte A os descriptografa usando a chave privada que corresponde. A descriptografia será bem-sucedida somente se a parte A usar a chave privada que corresponde à chave pública que a Parte B usou para criptografar os dados.

Para informações sobre como armazenar uma chave assimétrica no contêiner de chave de criptografia segura e como recuperar a chave assimétrica posteriormente, confira Como armazenar chaves assimétricas em um contêiner de chaves.

O exemplo a seguir ilustra a descriptografia de duas matrizes de bytes que representam uma chave simétrica e IV. Para informações sobre como extrair a chave pública assimétrica do objeto RSA em um formato que você pode enviar facilmente para terceiros, confira Como criptografar dados.

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

Confira também