Criptografia em C#: Guia de Implementação de Algoritmos Simétricos, Assimétricos e Hashing

No desenvolvimento de aplicações com C#, a proteção de informações sensíveis é uma prioridade constante. As técnicas de proteção de dados dividem-se geralmente em duas categorias principais: criptografia reversível (onde os dados podem ser recuperados) e hashing irreversível (unidirecional).

  • Reversíveis: AES, DES, RSA.
  • Irreversíveis (Hashing): MD5, família SHA.

1. Algoritmo de Hashing MD5

O MD5 (Message-Digest Algorithm 5) é uma função de dispersão amplamente utilizada para verificar a integridade de arquivos e armazenar senhas (embora para senhas modernas, algoritmos mais fortes sejam recomendados). Ele gera um valor de 128 bits, normalmente representado como uma string hexadecimal de 32 caracteres.

using System;
using System.Security.Cryptography;
using System.Text;

public static class HashHelper
{
    public static string GerarHashMD5(string texto)
    {
        using (MD5 algoritmo = MD5.Create())
        {
            byte[] entradaBytes = Encoding.UTF8.GetBytes(texto);
            byte[] hashBytes = algoritmo.ComputeHash(entradaBytes);

            StringBuilder sb = new StringBuilder();
            foreach (byte b in hashBytes)
            {
                sb.Append(b.ToString("x2"));
            }
            return sb.ToString().ToUpper();
        }
    }
}

2. Criptografia Simétrica DES

O Data Encryption Standard (DES) é um algoritmo simétrico clássico. Ele utiliza uma chave de 64 bits (sendo 56 bits efetivos) para processar blocos de dados. Por ser um padrão mais antigo, é frequentemente utilizado em sistemas legados.

public static string EncriptarDES(string conteudo, string chaveAcesso, string vetorInicial)
{
    byte[] bytesChave = Encoding.ASCII.GetBytes(chaveAcesso);
    byte[] bytesIv = Encoding.ASCII.GetBytes(vetorInicial);
    byte[] dadosPuros = Encoding.UTF8.GetBytes(conteudo);

    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
    {
        using (var ms = new System.IO.MemoryStream())
        {
            using (var cs = new CryptoStream(ms, des.CreateEncryptor(bytesChave, bytesIv), CryptoStreamMode.Write))
            {
                cs.Write(dadosPuros, 0, dadosPuros.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());
            }
        }
    }
}

public static string DecriptarDES(string conteudoCriptografado, string chaveAcesso, string vetorInicial)
{
    byte[] bytesChave = Encoding.ASCII.GetBytes(chaveAcesso);
    byte[] bytesIv = Encoding.ASCII.GetBytes(vetorInicial);
    byte[] dadosCripto = Convert.FromBase64String(conteudoCriptografado);

    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
    {
        using (var ms = new System.IO.MemoryStream(dadosCripto))
        {
            using (var cs = new CryptoStream(ms, des.CreateDecryptor(bytesChave, bytesIv), CryptoStreamMode.Read))
            {
                using (var sr = new System.IO.StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}

3. Criptografia Assimétrica RSA

Diferente dos algoritmos simétricos, o RSA utiliza um par de chaves: uma pública (para criptografia) e uma privada (para descriptografia). É o padrão ouro para assinaturas digitais e troca segura de chaves.

public static string ProcessarRSA(string dado, bool ehCriptografia, string nomeContainer = "ContainerSeguro")
{
    var parametros = new CspParameters { KeyContainerName = nomeContainer };
    using (var rsa = new RSACryptoServiceProvider(parametros))
    {
        if (ehCriptografia)
        {
            byte[] bytesParaCriptografar = Encoding.UTF8.GetBytes(dado);
            byte[] resultado = rsa.Encrypt(bytesParaCriptografar, false);
            return Convert.ToBase64String(resultado);
        }
        else
        {
            byte[] bytesParaDescriptografar = Convert.FromBase64String(dado);
            byte[] resultado = rsa.Decrypt(bytesParaDescriptografar, false);
            return Encoding.UTF8.GetString(resultado);
        }
    }
}

4. Codificação Base64

Embora não seja tecnicamente um algoritmo de criptografia, a codificação Base64 é essencial para converter dados binários resultantes de processos criptográficos em formatos de texto legíveis e transportáveis.

public static string CodificarBase64(string textoSimples)
{
    byte[] bytes = Encoding.UTF8.GetBytes(textoSimples);
    return Convert.ToBase64String(bytes);
}

public static string DecodificarBase64(string textoBase64)
{
    byte[] bytes = Convert.FromBase64String(textoBase64);
    return Encoding.UTF8.GetString(bytes);
}

5. Algoritmos SHA (Secure Hash Algorithm)

Os algoritmos SHA são considerados sucessores mais seguros do MD5. Atualmente, o SHA-256 e versões superiores são recomendados para garantir que uma entrada de dados não foi alterada.

public static string GerarSHA256(string entrada)
{
    using (SHA256 sha256Hash = SHA256.Create())
    {
        byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(entrada));
        return Convert.ToBase64String(bytes);
    }
}

6. Criptografia Avançada AES

O Advanced Encryption Standard (AES) é o sucessor do DES e o algoritmo simétrico mais utilizado mundialmente. Ele opera com chaves de 128, 192 ou 256 bits, oferecendo um nível de segurança extremamente elevado para proteção de dados locais e em trânsito.

public static string CriptografarAES(string textoPuro, string chaveSecreta)
{
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Encoding.UTF8.GetBytes(chaveSecreta);
        aesAlg.Mode = CipherMode.ECB; // Exemplo simplificado
        aesAlg.Padding = PaddingMode.PKCS7;

        ICryptoTransform encriptador = aesAlg.CreateEncryptor();
        byte[] bufferOriginal = Encoding.UTF8.GetBytes(textoPuro);
        byte[] resultado = encriptador.TransformFinalBlock(bufferOriginal, 0, bufferOriginal.Length);
        
        return Convert.ToBase64String(resultado);
    }
}

public static string DescriptografarAES(string textoCifrado, string chaveSecreta)
{
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Encoding.UTF8.GetBytes(chaveSecreta);
        aesAlg.Mode = CipherMode.ECB;
        aesAlg.Padding = PaddingMode.PKCS7;

        ICryptoTransform decriptador = aesAlg.CreateDecryptor();
        byte[] bufferCifrado = Convert.FromBase64String(textoCifrado);
        byte[] resultado = decriptador.TransformFinalBlock(bufferCifrado, 0, bufferCifrado.Length);
        
        return Encoding.UTF8.GetString(resultado);
    }
}

Tags: C# cryptography .NET AES rsa

Publicado em 7-26 04:40