Compartilhar via


Criptografia de dados

A criptografia simétrica e assimétrica são executadas usando diferentes processos. A criptografia simétrica é realizada em fluxos e, portanto, é útil para criptografar grandes quantidades de dados. A criptografia assimétrica é realizada em um pequeno número de bytes e, portanto, só é útil para pequenas quantidades de dados.

Criptografia simétrica

As classes de criptografia simétrica gerenciadas são usadas com uma classe de fluxo especial chamada um CryptoStream que criptografa dados lidos no fluxo. O CryptoStream a classe é inicializada com uma classe gerenciada de fluxo, uma classe que implementa o ICryptoTransform interface (criado de uma classe que implementa um algoritmo de criptografia) e um CryptoStreamMode enumeração que descreve o tipo de acesso permitido para o CryptoStream. O CryptoStream classe pode ser inicializado usando qualquer classe que deriva do Stream de classe, incluindo FileStream, MemoryStream, e NetworkStream. Usando essas classes, você pode executar a criptografia simétrica em uma variedade de objetos de fluxo.

O exemplo a seguir ilustra como criar uma nova instância da RijndaelManaged classe que implementa o algoritmo de criptografia Rijndael e usá-lo para realizar a criptografia em um CryptoStream classe. Neste exemplo, o CryptoStream é inicializada com um objeto de fluxo chamado MyStream que pode ser qualquer tipo de fluxo gerenciados. O CreateEncryptor método a partir de RijndaelManaged classe é passada para a chave e IV são usados para criptografia. Nesse caso, a chave padrão e IV gerados a partir RMCrypto são usados. Finalmente, o CryptoStreamMode.Write é passado, especificando o acesso de gravação no fluxo.

Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateEncryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Write)
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateEncryptor(), CryptoStreamMode.Write);

Após esse código é executado, todos os dados gravados para o CryptoStream objeto é criptografado usando o algoritmo Rijndael.

O exemplo a seguir mostra todo o processo de criar um fluxo de, criptografando o fluxo, escrita no fluxo e fechando o fluxo. Este exemplo cria um fluxo de rede é criptografado usando o CryptoStream classe e o RijndaelManaged classe. Uma mensagem é gravada no fluxo criptografado com o StreamWriter classe.

Observação

Você também pode usar este exemplo para gravar em um arquivo.Para isso, exclua o TcpClient de referência e substituir o NetworkStream com um FileStream.

Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Net.Sockets

Module Module1
Sub Main()
   Try
      'Create a TCP connection to a listening TCP process.
      'Use "localhost" to specify the current computer or
      'replace "localhost" with the IP address of the 
      'listening process. 
      Dim TCP As New TcpClient("localhost", 11000)

      'Create a network stream from the TCP connection. 
      Dim NetStream As NetworkStream = TCP.GetStream()

      'Create a new instance of the RijndaelManaged class
      'and encrypt the stream.
      Dim RMCrypto As New RijndaelManaged()

            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}

      'Create a CryptoStream, pass it the NetworkStream, and encrypt 
      'it with the Rijndael class.
      Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Write)

      'Create a StreamWriter for easy writing to the 
      'network stream.
      Dim SWriter As New StreamWriter(CryptStream)

      'Write to the stream.
      SWriter.WriteLine("Hello World!")

      'Inform the user that the message was written
      'to the stream.
      Console.WriteLine("The message was sent.")

      'Close all the connections.
      SWriter.Close()
      CryptStream.Close()
      NetStream.Close()
      TCP.Close()
   Catch
      'Inform the user that an exception was raised.
      Console.WriteLine("The connection failed.")
   End Try
End Sub
End Module
using System;
using System.IO;
using System.Security.Cryptography;
using System.Net.Sockets;
 
public class main
{
   public static void Main(string[] args)
   {
      try
      {
         //Create a TCP connection to a listening TCP process.
         //Use "localhost" to specify the current computer or
         //replace "localhost" with the IP address of the 
         //listening process.  
         TcpClient TCP = new TcpClient("localhost",11000);
   
         //Create a network stream from the TCP connection. 
         NetworkStream NetStream = TCP.GetStream();

         //Create a new instance of the RijndaelManaged class
         // and encrypt the stream.
         RijndaelManaged RMCrypto = new RijndaelManaged();

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

         //Create a CryptoStream, pass it the NetworkStream, and encrypt 
         //it with the Rijndael class.
         CryptoStream CryptStream = new CryptoStream(NetStream, 
         RMCrypto.CreateEncryptor(Key, IV),   
         CryptoStreamMode.Write);

         //Create a StreamWriter for easy writing to the 
         //network stream.
         StreamWriter SWriter = new StreamWriter(CryptStream);

         //Write to the stream.
         SWriter.WriteLine("Hello World!");

         //Inform the user that the message was written
         //to the stream.
         Console.WriteLine("The message was sent.");

         //Close all the connections.
         SWriter.Close();
         CryptStream.Close();
         NetStream.Close();
         TCP.Close();
      }
      catch
      {
         //Inform the user that an exception was raised.
         Console.WriteLine("The connection failed.");
      }
   }
}

No exemplo anterior executar com êxito, deve haver um processo de escuta no endereço IP e número da porta especificada no TCPCLient classe. Se existir em um processo de escutando, o código irá conectar-se ao processo de escutando, criptografar o fluxo usando o algoritmo Rijndael simétrico e escrever "Hello World!" o fluxo. Se o código for bem-sucedido, ele exibe o texto a seguir para o console:

The message was sent.

No entanto, não se for encontrado nenhum processo de escutando ou uma exceção, o código exibe o seguinte texto no console:

The connection failed.

Criptografia assimétrica

Geralmente, os algoritmos assimétricos são usados para criptografar pequenas quantidades de dados como, por exemplo, a criptografia de chave simétrica e IV. Normalmente, uma individual executando a criptografia assimétrica usa a chave pública gerada por outra pessoa. O RSACryptoServiceProvider classe é fornecida pelo.NET Framework para essa finalidade.

O exemplo a seguir usa as informações de chave públicas para criptografar uma chave simétrica e IV. Matrizes de dois bytes são inicializados que representam a chave pública de terceiros. Um RSAParameters o objeto é inicializado para esses valores. Avançar, o RSAParameters o objeto (juntamente com a chave pública que ela representa) é importado para um RSACryptoServiceProvider usando o RSACryptoServiceProvider.ImportParameters método. Finalmente, a chave particular e IV são criados por um RijndaelManaged classe são criptografadas. Este exemplo requer sistemas tenham a criptografia de 128 bits instalada.

Imports System
Imports System.Security.Cryptography

Module Module1

    Sub Main()
        'Initialize the byte arrays to the public key information.
      Dim PublicKey As Byte() =  {214, 46, 220, 83, 160, 73, 40, 39, 201, 155, 19,202, 3, 11, 191, 178, 56, 74, 90, 36, 248, 103, 18, 144, 170, 163, 145, 87, 54, 61, 34, 220, 222, 207, 137, 149, 173, 14, 92, 120, 206, 222, 158, 28, 40, 24, 30, 16, 175, 108, 128, 35, 230, 118, 40, 121, 113, 125, 216, 130, 11, 24, 90, 48, 194, 240, 105, 44, 76, 34, 57, 249, 228, 125, 80, 38, 9, 136, 29, 117, 207, 139, 168, 181, 85, 137, 126, 10, 126, 242, 120, 247, 121, 8, 100, 12, 201, 171, 38, 226, 193, 180, 190, 117, 177, 87, 143, 242, 213, 11, 44, 180, 113, 93, 106, 99, 179, 68, 175, 211, 164, 116, 64, 148, 226, 254, 172, 147}

        Dim Exponent As Byte() = {1, 0, 1}

        'Create values to store encrypted symmetric keys.
        Dim EncryptedSymmetricKey() As Byte
        Dim EncryptedSymmetricIV() As Byte

        'Create a new instance of the RSACryptoServiceProvider class.
        Dim RSA As New RSACryptoServiceProvider()

        'Create a new instance of the RSAParameters structure.
        Dim RSAKeyInfo As New RSAParameters()

        'Set RSAKeyInfo to the public key values. 
        RSAKeyInfo.Modulus = PublicKey
        RSAKeyInfo.Exponent = Exponent

        'Import key parameters into RSA.
        RSA.ImportParameters(RSAKeyInfo)

        'Create a new instance of the RijndaelManaged class.
        Dim RM As New RijndaelManaged()

        'Encrypt the symmetric key and IV.
        EncryptedSymmetricKey = RSA.Encrypt(RM.Key, False)
        EncryptedSymmetricIV = RSA.Encrypt(RM.IV, False)
    End Sub

End Module
using System;
using System.Security.Cryptography;

class Class1
{
   static void Main()
   {
      //Initialize the byte arrays to the public key information.
      byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
            74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
            207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
            108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
            240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
            168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
            38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
            106,99,179,68,175,211,164,116,64,148,226,254,172,147};

      byte[] Exponent = {1,0,1};
      
      //Create values to store encrypted symmetric keys.
      byte[] EncryptedSymmetricKey;
      byte[] EncryptedSymmetricIV;

      //Create a new instance of the RSACryptoServiceProvider class.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create a new instance of the RSAParameters structure.
      RSAParameters RSAKeyInfo = new RSAParameters();

      //Set RSAKeyInfo to the public key values. 
      RSAKeyInfo.Modulus = PublicKey;
      RSAKeyInfo.Exponent = Exponent;

      //Import key parameters into RSA.
      RSA.ImportParameters(RSAKeyInfo);

      //Create a new instance of the RijndaelManaged class.
      RijndaelManaged RM = new RijndaelManaged();

      //Encrypt the symmetric key and IV.
      EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
      EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);
   }
}

Consulte também

Conceitos

A geração de chaves de criptografia e descriptografia

Descriptografar dados

Serviços de criptografia

Outros recursos

Tarefas de criptografia