Desenvolvimento - C#

Explorando classes de criptografia

Existem duas formas básicas de criptografia: simétrica e assimétrica. Neste artigo iremos falar sobre a criptografia simétrica.

por Rodrigo S. Donini



Necessário e desconhecido para muitos e usado por poucos, os sistemas de criptografia são cada vez mais necessários. A comunicação de dados entre as aplicações de hoje, devem obedecer alguns pré-requisitos de segurança, principalmente quando os dados que circulam em uma rede, são de uma importância e privacidade para empresa e seus clientes.

Alguns desenvolvedores se questionam sobre como montar uma forte camada de segurança dentro de uma aplicação, como criptografar dados e que algoritmos usar. O .Net Framework conta com a namespace System.Security.Cryptography que possui uma série de classes que podem lhe auxiliar ao implementar este tipo de rotinas, incluindo serviços de criptografia, encoder e decorder de dados e muitas outras operações como a criação de Hash.

Existem duas formas básicas de criptografia: simétrica e assimétrica. Neste artigo iremos falar sobre a criptografia simétrica.

Para criptografia de dados, iremos usar as seguintes classes: Rijndael, RC2, DES e TripleDES. Para criação de Hash de dados, iremos usar as seguintes classes: MD5, SHA1, SHA256, SHA384 e SHA512.

Faça download do fonte: CryptHash.zip


Figura 1: Modelo de interface para teste

Criando classes auxiliares para manipulação dos dados

Acompanhe o diagrama de classes, pode-se entender de forma fácil a lógica de uso das mesmas.


Figura 2: Diagrama de classes

Dentro de cada classe existem métodos complementares, cada qual com sua função específica, e também alguns enums dos tipos de algoritmos que usaremos para cada tipo de classe.

Usando as classes

Estas são classes auxiliares com métodos para criptografia e criação de hash de dados, o uso delas é bastante simples e não necessitam muitas explicações. Dentro do código, encontram-se quaisquer comentários adicionais para entendimento do funcionamento das rotinas, faça download do fonte do exemplo e confira, o mesmo também contém o help das classes. Acompanhe na listagem 1 um modelo de código com o uso destas classes.

string encryptedText = string.Empty;

string decryptedText = string.Empty;

string hashedText = string.Empty;

string plainText = "Lisiano Hacker";

string key = "Nasa";

Crypt _crypt = new Crypt(CryptProvider.TripleDES);

_crypt.Key = key;

encryptedText = _crypt.Encrypt(plainText);

decryptedText = _crypt.Decrypt(encryptedText);

Hash _hash = new Hash(HashProvider.SHA1);

hashedText = _hash.GetHash(plainText);
Listagem 1: Modelo de uso das classes Crypt e Hash

Os Construtores

Os construtores das duas classes atribuem o tipo de algoritmo que será usado na criptografia e na criação do hash dos dados. O construtor padrão delas, sempre carrega um algoritmo padrão, cada classe com seu tipo.

Observações gerais

Em especial na classe Crypt, todos os algoritmos usados neste exemplo necessitam de um vetor de inicialização, nada mais é que uma matriz de bytes, valores usados internamente pela classe para gerar os dados criptografados em conjunto com a chave enviada. Acompanhe na listagem 2 a matriz de valores padrões carregando os valores em hexadecimal.

private void SetIV()

{

switch (_cryptProvider)

{

case CryptProvider.Rijndael:

_algorithm.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9, 0x5, 0x46, 0x9c, 0xea, 0xa8, 0x4b, 0x73, 0xcc };

break;

default:

_algorithm.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9 };

break;

}

}
Listagem 2: (IV - Initialization Vector)

Conclusão

Dentro da namespace System.Security.Cryptography, existem ainda muitas outras classes que podemos explorar em um outro artigo. Descobrimos como usar alguns algoritmos de criptografia e criação de hash, montamos classes auxiliares para facilitar o uso destes recursos.

Como sempre, abaixo encontram-se as principais referências relacionadas.

Mais uma vez, fico a disposição para esclarecer dúvidas, inclusive se quiserem contribuir com melhorias e dicas para o artigo, bastam me enviar um e-mail ou comentar abaixo.

Um abraço e até a próxima!

Referências

System.Security.Cryptography Namespace
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.aspx

DES Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.des.aspx

RC2 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.rc2.aspx

Rijndael Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx

TripleDES Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.tripledes.aspx

MD5 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.md5.aspx

SHA1 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx

SHA256 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx

SHA384 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha384.aspx

SHA512 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx

Rodrigo S. Donini

Rodrigo S. Donini - Coordenador de desenvolvimento, líder de desenvolvimento nas tecnologias Microsoft, com fortes conhecimentos de client/server/web e metodologias de desenvolvimento.