Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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);