Descriptografar dados
Descriptografia é a operação inversa da criptografia. Para criptografia de chave secreta, você deve conhecer a chave e IV que foram usadas para criptografar os dados. Para criptografia de chave pública, você deve conhecer a chave pública (se os dados foram criptografados usando a chave particular) ou a chave particular (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. O CryptoStream classe é usada com classes de criptografia simétrica, fornecidas pela.Gerenciado de NET Framework para descriptografar os dados lidos a partir de qualquer objeto de fluxo.
O exemplo a seguir ilustra como criar uma nova instância da RijndaelManaged de classe e usá-lo para realizar a descriptografia em um CryptoStream objeto. Este exemplo cria uma nova instância de RijndaelManaged classe. Em seguida, cria um CryptoStream objeto e inicializa-lo para o valor de um fluxo gerenciado chamado MyStream. Avançar, o CreateDecryptor método a partir de RijndaelManaged classe é passada para a mesma chave e IV que foi usado para criptografia e, em seguida, é passado para o CryptoStream construtor. Finalmente, o CryptoStreamMode.Read enumeração é passada para o CryptoStream construtor para especificar o acesso de leitura no fluxo.
Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateDecryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Read)
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
O exemplo a seguir mostra todo o processo de criar um fluxo, descriptografando o fluxo, leitura do fluxo de e fechando os fluxos. A TCPListener objeto é criado e inicializa um fluxo de rede quando é feita uma conexão para o objeto de escuta. O fluxo de rede, em seguida, é descriptografado usando a CryptoStream classe e o RijndaelManaged classe. Este exemplo assume que a chave e valores de IV tem foram transferidos com êxito ou acordados anteriormente. Ele não mostra o código necessário para criptografar e transferir esses valores.
Imports System
Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System.Net
Imports System.Security.Cryptography
Module Module1
Sub Main()
'The key and IV must be the same values that were 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}
Dim IV As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Try
'Initialize a TCPListener on port 11000
'using the current IP address.
Dim TCPListen As New TcpListener(IPAddress.Any, 11000)
'Start the listener.
TCPListen.Start()
'Check for a connection every five seconds.
While Not TCPListen.Pending()
Console.WriteLine("Still listening. Will try in 5 seconds.")
Thread.Sleep(5000)
End While
'Accept the client if one is found.
Dim TCP As TcpClient = TCPListen.AcceptTcpClient()
'Create a network stream from the connection.
Dim NetStream As NetworkStream = TCP.GetStream()
'Create a new instance of the RijndaelManaged class
'and decrypt the stream.
Dim RMCrypto As New RijndaelManaged()
'Create an instance of the CryptoStream class, pass it the NetworkStream, and decrypt
'it with the Rijndael class using the key and IV.
Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read)
'Read the stream.
Dim SReader As New StreamReader(CryptStream)
'Display the message.
Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd())
'Close the streams.
SReader.Close()
NetStream.Close()
TCP.Close()
'Catch any exceptions.
Catch
Console.WriteLine("The Listener Failed.")
End Try
End Sub
End Module
using System;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net;
using System.Security.Cryptography;
class Class1
{
static void Main(string[] args)
{
//The key and IV must be the same values that were used
//to encrypt the stream.
byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
try
{
//Initialize a TCPListener on port 11000
//using the current IP address.
TcpListener TCPListen = new TcpListener(IPAdress.Any, 11000);
//Start the listener.
TCPListen.Start();
//Check for a connection every five seconds.
while(!TCPListen.Pending())
{
Console.WriteLine("Still listening. Will try in 5 seconds.");
Thread.Sleep(5000);
}
//Accept the client if one is found.
TcpClient TCP = TCPListen.AcceptTcpClient();
//Create a network stream from the connection.
NetworkStream NetStream = TCP.GetStream();
//Create a new instance of the RijndaelManaged class
// and decrypt the stream.
RijndaelManaged RMCrypto = new RijndaelManaged();
//Create a CryptoStream, pass it the NetworkStream, and decrypt
//it with the Rijndael class using the key and IV.
CryptoStream CryptStream = new CryptoStream(NetStream,
RMCrypto.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
//Read the stream.
StreamReader SReader = new StreamReader(CryptStream);
//Display the message.
Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd());
//Close the streams.
SReader.Close();
NetStream.Close();
TCP.Close();
}
//Catch any exceptions.
catch
{
Console.WriteLine("The Listener Failed.");
}
}
}
No exemplo anterior trabalhar, uma conexão criptografada deve ser feita ao ouvinte. A conexão deve usar a mesma chave, IV e algoritmo usado no ouvinte da. Se uma conexão for feita, a mensagem é descriptografada e exibida no console.
Descriptografia assimétrica
Normalmente, uma festa (de terceiros) gera tanto uma chave pública e privada e armazena a chave na memória ou em um recipiente de chave de criptografia. Festa de um, em seguida, envia a chave pública para outra pessoa (parte B). Usando a chave pública, terceiros b criptografa os dados e envia os dados de volta para a terceiros. Depois de receber os dados, terceiros a descriptografa usando a chave particular correspondente. Descriptografia serão bem-sucedidas apenas se a empresa usa a chave particular que corresponde à chave pública que b de terceiros é usada para criptografar os dados.
Para obter informações sobre como armazenar uma chave assimétrica no recipiente de chave de criptografia segura e como posteriormente recuperar a chave assimétrica, consulte Como: Armazenar Chaves Asssimé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 RSACryptoServiceProvider o objeto em um formato que você poderá enviar facilmente por terceiros, consulte Criptografia de dados.
'Create a new instance of the RSACryptoServiceProvider class.
Dim RSA As New RSACryptoServiceProvider()
' 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, False)
SymmetricIV = RSA.Decrypt(EncryptedSymmetricIV, False)
//Create a new instance of the RSACryptoServiceProvider class.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
// 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, false);
SymmetricIV = RSA.Decrypt( EncryptedSymmetricIV , false);
Consulte também
Conceitos
A geração de chaves de criptografia e descriptografia