Compartilhar via


Descriptografar dados

Descriptografia é a operação inversa de criptografia.Para criptografia de chave secreta, você deve conhecer a chave e o IV que foram usadas para criptografar os dados.Para criptografia de chave pública, você deve conhecer tanto 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.The CryptoStream classe é usada com classes de criptografia simétrica fornecidos pelo .NET estrutura para descriptografar dados lidos de qualquer objeto gerenciado de fluxo.

O exemplo a seguir ilustra como criar uma nova instância do RijndaelManaged classe e usá-lo para realizar a descriptografia em um CryptoStream objeto. Este exemplo primeiro cria uma nova instância do RijndaelManaged classe.Em seguida, ele cria um CryptoStream objeto e inicializa-o para o valor de um fluxo gerenciado chamado MyStream. Em seguida, a CreateDecryptor método do oRijndaelManaged classe é passado a mesma chave e IV que foi usado para criptografia e, em seguida, é passado para o CryptoStream construtor.Finalmente, a 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, descriptografar o fluxo, leitura do fluxo de e fechando os fluxos de.A TCPListener objeto é criado que inicializa um fluxo de rede quando é feita uma conexão para o objeto de escuta.O fluxo de rede é descriptografado, em seguida, usando o CryptoStream classe e o RijndaelManaged classe.Este exemplo assume que a chave e valores de IV foram seja transferidos com êxito ou acordados anteriormente.Ele não mostra o código necessário para criptografar e transferência 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 funcione, deve ser feita uma conexão criptografada para o ouvinte.A conexão deve usar a mesma chave, IV e algoritmo usado no ouvinte da.Se essa conexão for feita, a mensagem é descriptografada e exibida para o console.

Descriptografia assimétrica

Normalmente, uma parte (A parte) gera tanto uma chave pública e particular e armazena a chave na memória ou em um contêiner de chave de criptografia.Festa de um, em seguida, envia a chave pública para outra pessoa (parte B).Usando a chave pública, empresa B criptografa os dados e envia os dados para outra empresa a.Depois de receber os dados, terceiros A descriptografa usando a chave particular correspondente.Descriptografia terá êxito somente se A parte usa a chave particular que corresponde à chave pública parceiro B usada para criptografar os dados.

Para obter informações sobre como armazenar uma chave assimétrica no contêiner de chave de criptografia seguro e como recuperar a chave assimétrica posteriormente, 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 objeto em um formato que você poderá enviar com com facilidade a terceiros, consulte Criptografando 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

Gerando chaves de criptografia e descriptografia

Criptografando dados

Outros recursos

Tarefas de criptografia

Serviços de criptografia