Gerar chaves para criptografia e descriptografia

Criar e gerenciar chaves é uma parte importante do processo criptográfico. Algoritmos simétricos exigem a criação de uma chave e um IV (vetor de inicialização). Você deve manter essa chave em segredo de quem não deve descriptografar seus dados. O IV não precisa ser secreto, mas deve ser alterado para cada sessão. Algoritmos assimétricos exigem a criação de uma chave pública e uma chave privada. A chave pública pode ser conhecida por qualquer pessoa, mas a parte descriptografada deve conhecer apenas a chave privada correspondente. Esta seção descreve como gerar e gerenciar chaves para algoritmos simétricos e assimétricos.

Chaves simétricas

As classes de criptografia simétrica fornecidas pelo .NET exigem uma chave e um novo IV para criptografar e descriptografar dados. Uma chave e IV são criados automaticamente sempre que você cria uma instância de uma das classes criptográficas simétricas gerenciadas usando o método Create() sem parâmetros. Qualquer pessoa que você permitir descriptografar seus dados deve ter a mesma chave e IV e usar o mesmo algoritmo. Em geral, uma nova chave e IV devem ser criados para cada sessão e nem a chave nem a IV devem ser armazenadas para uso em uma sessão posterior.

Para comunicar uma chave simétrica e IV a uma parte remota, você normalmente criptografa a chave simétrica usando criptografia assimétrica. Enviar a chave em uma rede insegura sem criptografá-la não é seguro, pois qualquer pessoa que intercepte a chave e a IV pode descriptografar seus dados.

O exemplo a seguir mostra a criação de uma instância da classe de implementação padrão para o algoritmo Aes:

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

A execução do código anterior gera uma nova chave e IV e os define como valores para as propriedades Key e IV, respectivamente.

Às vezes, pode ser necessário gerar várias chaves. Nessa situação, você pode criar uma nova instância de uma classe que implementa um algoritmo simétrico. Em seguida, crie uma nova chave e IV chamando os métodos GenerateKey e GenerateIV. O exemplo de código a seguir ilustra como criar chaves e IVs após a criação de uma instância da classe criptográfica simétrica:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

A execução do código anterior cria uma nova instância de Aes e gera uma chave e IV. Outra chave e IV são criados quando os métodos GenerateKey e GenerateIV são chamados.

Chaves assimétricas

O .NET fornece a classe RSA para criptografia assimétrica. Quando você usa o método Create() sem parâmetros para criar uma nova instância, a classe RSA cria um par de chaves pública/privada. As chaves assimétricas podem ser armazenadas para uso em várias sessões ou geradas apenas para uma sessão. Embora você possa disponibilizar a chave pública, você deve proteger de perto a chave privada.

Um par de chaves pública/privada é gerado quando você cria uma nova instância de uma classe de algoritmo assimétrica. Depois de criar uma nova instância da classe, você pode extrair as informações de chave usando o método ExportParameters. Esse método retorna uma estrutura RSAParameters que contém as informações principais. O método também aceita um valor booliano que indica se deve retornar apenas as informações de chave pública ou retornar a chave pública e as informações de chave privada.

Você também pode usar outros métodos para extrair as informações principais, como:

Você pode usar o método ImportParameters para inicializar uma instância RSA ao valor de uma classe RSAParameters. Ou você pode usar o método RSA.Create(RSAParameters) para criar uma nova instância.

Nunca armazene chaves privadas assimétricas verbais ou como texto sem formatação no computador local. Se precisar armazenar uma chave privada, você deverá usar um contêiner de chave. Para obter mais informações sobre como armazenar uma chave privada em um contêiner de chaves, confira Como armazenar chaves assimétricas em um contêiner de chaves.

O exemplo de código a seguir cria uma nova instância da classe RSA, cria um par de chaves pública/privada e salva as informações da chave pública em uma estrutura RSAParameters:

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

Confira também