Partilhar via


Desencriptação de dados

A desencriptação é a operação inversa da encriptação. Para criptografia de chave secreta, você deve saber a chave e o IV que foram usados 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).

Desencriptação simétrica

A desencriptação de dados encriptados com algoritmos simétricos é semelhante ao processo usado para encriptar dados com algoritmos simétricos. A CryptoStream classe é usada com classes de criptografia simétrica fornecidas pelo .NET para descriptografar dados lidos de qualquer objeto de fluxo gerenciado.

O exemplo a seguir ilustra como criar uma nova instância da classe de implementação padrão para o Aes algoritmo. A instância é usada para executar a descriptografia em um CryptoStream objeto. Este exemplo primeiro cria uma nova instância da Aes classe de implementação. Ele lê o valor do vetor de inicialização (IV) de uma variável de fluxo gerenciado, fileStream. Em seguida, ele instancia um CryptoStream objeto e o inicializa com o valor da fileStream instância. O SymmetricAlgorithm.CreateDecryptor método da Aes instância é 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 criação de um fluxo, descriptografando o fluxo, lendo o fluxo e fechando os fluxos. É criado um objeto de fluxo de arquivos que lê um arquivo chamado TestData.txt. O fluxo de arquivos é então descriptografado usando a classe CryptoStream e a classe Aes . Este exemplo especifica o valor da chave que é usado no exemplo de criptografia simétrica para Encrypting Data. 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 usado no exemplo de criptografia simétrica para Criptografar Dados. Desencripta o ficheiro TestData.txt criado por esse exemplo e apresenta o texto original na consola.

Desencriptação 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 criptográfica. O partido A envia então a chave pública para outro partido (partido B). Usando a chave pública, a parte B criptografa os dados e envia os dados de volta para a parte A. Depois de receber os dados, a parte A desencripta-os usando a chave privada que corresponde. A desencriptação só será bem-sucedida se a parte A utilizar a chave privada que corresponde à chave pública B utilizada para encriptar os dados.

Para obter informações sobre como armazenar uma chave assimétrica no contêiner seguro de chaves criptográficas e como recuperar posteriormente a chave assimétrica, consulte 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 obter informações sobre como extrair a chave pública assimétrica do RSA objeto em um formato que você pode enviar facilmente para terceiros, consulte Criptografando 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);

Consulte também