Criptografando dados
Criptografias simétrica e assimétrica são executadas usando diferentes processos.A criptografia simétrica é executada 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, é útil somente para pequenas quantidades de dados.
Criptografia simétrica
As classes de criptografia simétrica gerenciado são usadas com uma classe de fluxo especial chamada um CryptoStream que criptografa dados lidos no fluxo. The CryptoStream classe é inicializada com uma classe de fluxo gerenciado, uma classe implementa a 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.The CryptoStream classe pode ser inicializado usando qualquer classe que deriva de Stream 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 do RijndaelManaged classe que implementa o algoritmo de criptografia Rijndael e usá-lo para executar a criptografia em um CryptoStream classe.Neste exemplo, a CryptoStream é inicializada com um objeto de fluxo chamado MyStream Isso pode ser qualquer tipo de fluxo gerenciado. The CreateEncryptor método do oRijndaelManaged classe é passado a chave e IV são usados para criptografia.Nesse caso, a chave padrão e IV gerado a partir de RMCrypto são usados. Finalmente, a CryptoStreamMode.gravar é passado, especificando o acesso de gravar 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);
Depois que esse código for 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, a gravação 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.
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 escutando o número da porta e endereço IP especificado no TCPCLient classe.Se existir um processo de escutando, o código irá conectar-se ao processo de escutando, criptografar o fluxo usando o algoritmo simétrico Rijndael e gravar "Hello World!" no fluxo.Se o código for bem-sucedido, ele exibirá o seguinte texto no console:
The message was sent.
No entanto, não se for encontrado nenhum processo de escutando ou uma exceção ocorre, o código exibe o texto a seguir para o console:
The connection failed.
Criptografia assimétrica
Algoritmos assimétrica geralmente são usados para criptografar uma pequena quantidade de dados, sistema autônomo a criptografia de uma chave simétrica e IV.Normalmente, uma criptografia assimétrica desempenho individual usa a chave pública gerada por outra pessoa.The RSACryptoServiceProvider classe é fornecida pelo .NET estrutura para essa finalidade.
O exemplo a seguir usa informações de chave públicas para criptografar uma chave simétrica e IV.Matrizes de dois byte são inicializados que representam a chave pública de terceiros.An RSAParameters objeto é inicializado para esses valores. Em seguida, a RSAParameters objeto (junto com a chave pública que ela representa) é importado para um RSACryptoServiceProvider usando o RSACryptoServiceProvider.ImportParameters método. Finalmente, a chave particular e IV criadas por um RijndaelManaged classe são criptografados. Este exemplo requer sistemas tenham criptografia de 128 bit 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
Gerando chaves de criptografia e descriptografia