sábado, 2 de março de 2013

Criptografando Strings em uma aplicação C#



















Como já vimos o básico sobre criptografia no post "O que é Criptografia?", vamos abordar de maneira prática a criptografia de strings utilizando uma aplicação Windows Forms com C#. Essa classe de criptografia poderá ser usada também em projetos Web (Web Forms, MVC).

Para iniciarmos a programação vou dizer que não vamos inventar a roda novamente, ou seja, não vamos criar o nosso próprio algoritmo de criptografia, vamos utilizar uma classe pronta do .Net, a MD5CryptoServiceProvider, que é encontrada desde a versão 1.1 do Framework.


1. Crie um projeto do Tipo Windows Forms (File - New - Project - Visual C# - Windows - Windows Forms Application);
2. Dê o nome do projeto de CriptografiaMD5;
3. Renomeie o "Form1.cs" para "frm_Crypt.cs";
4. Crie uma interface com 2 botões (1 para codificar e 1 para decodificar a string). Adicione também 4 Text Box's;
Criptografando com C#
Form para Codificar e Decodificar Strings
5. Nomeie-os da seguinte forma:
  • botão Criptografar: bt_encrypt;
  • botão Decriptar: bt_decript;
  • TextBox String para Encriptar: txt_toEncript;
  • TextBox Resultado Encriptar: txt_ResultEncript;
  • TextBox String Criptografada: txt_toDecript;
  • TextBox Resultado para Decriptar: txt_ResultDecript;
6. Crie uma classe com o nome "MD5Crypt.cs";
7. Abra a classe "MD5Crypt.cs" e importe a referência Cryptography, utilizando a sintaxe "using System.Security.Cryptography";
8. Introduza na classe o seguinte Código:
class MD5Crypt
    {
        const string senha = "12345";

        public static string Criptografar(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(Message);
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return Convert.ToBase64String(Results);
        }

        public static string Descriptografar(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return UTF8.GetString(Results);
        }
    }
9. Agora precisamos chamar a função para codificar e decodificar dentro dos botões. Vamos começar criptografando uma string, para isso, dê um duplo clique no botão "bt_encrypt" (Criptografar), e insira o código:
            string strToCript = txt_toEncript.Text;
            strToCript = MD5Crypt.Criptografar(strToCript);
            txt_ResultEncript.Text = strToCript;
10. Agora dê um duplo clique no botão "bt_decript" (Decriptar), e insira o código:
            string strToDecript = txt_toDecript.Text;
            strToDecript = MD5Crypt.Decript(strToDecript);
            txt_ResultDecript.Text = strToDecript;
Pronto, a sua classe de criptografia esta pronta para ser utilizada. Para testa-lá pressione o botão F5 para compilar o seu código, e insira um texto no campo "String para Encriptar" e posteriormente clique no botão "Criptografar". Será exibido no resultado a sua string codificada.

Você agora pode pegar essa string codificada, copiar e cola no campo "String Criptografada" e clicar no botão "Decriptar". O resultado tem que ser o mesmo valor do inserido no campo "String para Encriptar".

Agora você pode usar a sua imaginação e utilizar a criptografia como quiser em seus projetos, seja para proteger dados dos usuários, para armazenar senhas de usuários, enfim, use como achar necessário.

Você pode pegar esse projeto clicando aqui.

14 comentários:

  1. Muito bom Fábio. Obrigado pela grande ajuda.

    ResponderExcluir
    Respostas
    1. Olá Augusto! A intenção é justamente essa, ajudar ao próximo, pois essas dicas já me ajudaram muito.

      Abraços e volte sempre!

      Excluir
    2. Fabio, muito obrigada
      Você salvou minha vida em uma tarefa urgente!

      Obrigadaaaaa

      Excluir
    3. Parabéns. Muito bom o conteúdo.

      Excluir
  2. Olá Fábio, sou bastante leigo em programação estou começando os estudos por agora, poderia me ajudar em como faço para fazer uma tela no DEV c++ aonde imprima na tela uma senha depois ocorra a criptografia dela e a descriptografia ?Por enquanto fiz isso
    é um trabalho, e tenho que simular a criptografia com a senha do usuário que irá entrar
    #include
    #include



    char str[10];
    int i,j,Agencia,Conta;

    void main(void)

    {
    printf("\t\tNos campos abaixo informe sua agencia e conta!\n\n\n");
    printf("\tInforme sua gencia:\n\n\n");
    scanf("%i",&Agencia);
    printf("\tInforme sua Conta:\n\n\n");
    scanf("%i",&Conta);
    /*Nesta tela o usuário irá informar os dados, sem digito*/
    for(j=1;j<=3;j++)
    {
    i=0;
    printf("Informe a senha da Chave:\n");
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    i++;
    str[i]=getch();
    puts("*");
    if (strcmp(str,"1234")==0)
    {
    puts("Senha Invalida");
    exit(0);
    }
    else
    puts("Senha Invalida\n\n");

    }

    puts("\t\t\t\tsenha digitada 3 vezes incorretamente\n\n\n\n");

    system("PAUSE");
    return 0;
    }

    ResponderExcluir
    Respostas
    1. vc é leigo até d+

      Excluir
    2. e vc tem humildade ate demais ne fdp. Uns bosta como vc n passa de um programadorzinho mediano e irrisorio. O cara so quer tirar uma duvida

      Excluir
  3. Valeu cara! Muito bom esse post!

    ResponderExcluir
  4. 'MD5CRYPT' does not contain a definition for "Decript".

    que porra é isso?

    ResponderExcluir
  5. E aí Fabio, blz!?
    Parabéns pelo artigo.
    Acabei de usar aqui, rsrs
    Abraço.
    André Maciel

    ResponderExcluir
  6. Forum de discussao Brasileiro é muito diferente dos outros países. Aqui um chinga o outro a troco dd nada . La fora eles respsitam e ajudam uns aos outros

    ResponderExcluir
  7. muito bom , funciona perfeitamente... showww

    ResponderExcluir