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