terça-feira, 24 de agosto de 2010

Criptografia Assimétrica

Este artigo aplica-se aos seguintes produtos e tecnologias:

• Microsoft .Net Framework 2.0

Introdução

Este artigo é uma continuação de “Criptografia e Certificação Digital”.

Criptografia Assimétrica

Como citado no primeiro artigo desta série, a criptografia de dados usando algoritmos assimétricos dispõe de um par de chaves publica/privada. Quando o dado é criptografado com a chave pública, somente que tem a chave privada pode descriptografar. Esse algoritmo é muito utilizado quando a informação se externa ao sistema e é necessário manter um grau de segurança nos dados, e para que não seja divulgada uma única chave como é feito nos algoritmos simétricos, possuímos um par, e esse é divulgado somente a parte pública.

Imagine o seguinte cenário: Você precisa trocar informações confidenciais com alguns usuários sem precisar divulgar a chave de criptografia que utiliza. Para isso, é criado um par de chaves onde somente uma será divulgada para os usuários que você deseja receber a informação.



Ilustração 1 – Visualização da criptografia assimétrica.

O exemplo de código a seguir exemplifica o cenário mencionado usando o algoritmo RSA. Primeiramente o usuário “UserA” distribui a sua chave pública para aqueles que ele deseja receber a informação de forma segura. Em seguida o “UserB” codifica a mensagem com a chave pública enviada pelo “UserA”. Ressalto que somente quem tem a chave particular “UserA” poderá ler a mensagem.

Exemplos de código


//Instancia a classe RSA
RSACryptoServiceProvider rsaProviderGen = new RSACryptoServiceProvider();

// Obtém os pares de chaves
string publicKey = rsaProviderGen.ToXmlString(false);
string privateKey = rsaProviderGen.ToXmlString(true);
Console.WriteLine(String.Format("{0}{1}\n","Chave Pública.....:", publicKey));
Console.WriteLine(String.Format("{0}{1}\n","Chave Particular..:", privateKey));

// Mensagem a ser Cifrada
string messageToEncr = "Olá Mundo;)";
Console.WriteLine(String.Format("{0}{1}\n","Texto Plano.......:", messageToEncr));

// UserB gera a mensagem cifrada para o UserA utilizando a Chave Pública que lhe foi passada

RSACryptoServiceProvider rsaProviderEncr = new RSACryptoServiceProvider();
rsaProviderEncr.FromXmlString(publicKey);
byte[] messageToDencr = rsaProviderEncr.Encrypt(Encoding.Unicode.GetBytes(messageToEncr),false);
Console.WriteLine(String.Format("{0}{1}\n","Texto Cifrado.....:", System.Convert.ToBase64String(messageToDencr)));

// UserA lê a mensagem utilizando a sua chave partitular
RSACryptoServiceProvider rsaProviderDencr = new RSACryptoServiceProvider();
rsaProviderDencr.FromXmlString(privateKey);

string
plainMessage = Encoding.Unicode.GetString(rsaProviderDencr.Decrypt(messageToDencr,false));
Console.WriteLine(String.Format("{0}{1}\n","Texto Plano.....:", plainMessage));

Dica

Se o “UserA” precisa enviar informações para o “UserB”, é necessário que o “UserB” também crie seu par de chaves. Assim o “UserA” passa a utilziar a chave pública do “UserB” para cifrar a informação.

Links Relacionados

.NET Framework Cryptography Model

Bibliografia Utilizada

• Building Secure ASP.NET Applications, Microsoft Patterns & Practices

Nenhum comentário:

Postar um comentário