usando DCPcrypt em delphi

Discussão em 'Dicas e tutoriais' iniciado por kodo no kami, 13 Julho 2016.

  1. kodo no kami
    Offline

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    235
    Sexo:
    Masculino
    Avaliações:
    +312 / -0
    e ae galera faz maior tempão que não escrevo nenhum tutorial de delphi com isso resolvi escrever esse, nesse tutorial vamos aprender a usar o componente DCPCrypt que permite usar diversos algorítimos criptográficos como des, 3des, idea, ice, ice2, thinice blowfish, twofish, cast 128 e 160, mars, misty, rc 2 4 5 e 6, ridjindael, serpent e tea, ele tambem permite usar alguns algoritimos de hash como md5 e md4, sha1 256 384 512, tiger e haval, esse componente nao vem com o delphi e tambem nao vou abordar a instalação dele mesmo por que é mesma coisa dos demais componentes no caso basta baixar no site colocar na variavel de ambiente do delphi depois executar o dpk e por fim instalar (ele tambem serve para o borland c++ builder, lazarus e kylix)

    DCPcrypt

    [​IMG]

    bom galera depois de instalado a gente pode puxar um dos componente desejado para o form sendo o uso de todos eles a mesma coisa apenas diferenciando um pouco a criptografia e a hash, nesse caso vamos começar pela hash e a escolhida foi a md5 (tambem criei no form dois edits um vai ser onde vou escrever o texto e o outro onde vai aparecer a hash e um button para executar tambem)

    [​IMG]

    dentro do evento onclick do button a gente precisa iniciar a hash com o metodo Init

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       DCP_md51.Init;
    end;
    agora passamos o texto dentro porem existem diversos metodos para diversas formas de passar o texto sendo algumas dessas buffer e stream porem vamos usar o metodo UpdateStr que permite passar uma string que no caso vai ser o que estiver no primeiro edit

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
    end;
    por fim usamos o metodo final para enviar o resultado para alguma variavel, porem essa variavel deve ser uma array do tipo byte com tamanho maior que quantidade de bytes da hash (no caso do md5 é 16bytes ou 128bits)

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var kodomd5: array [1 .. 17] of byte;
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
       DCP_md51.Final(kodomd5);
    end;
    com isso a hash esta armazenada na array do tipo byte ou seja cada posição dele é um byte da hash porem nao podemos atribuir ela diretamente para o edit2 ja que ele apenas aceita string, tambem existe outro problema as hash usa todos os caracteres com isso pode aparecer um byte entre o numero 0 e 25 (0 e 19 em hex), numeros entre 0 e 25 nao sao caracteres visiveis mais sim caracteres especiais como enter, tabulação, quebra de linha etc, com isso a gente nao pode mostrar os carecteres em si e sim o numero que representa eles, entao precisamos converter o byte por um tipo numerico (coisa que ele ja é) e depois exibir esse tipo numerico como string para isso usamos a função inttostr isso para todas as posições da array, para um exemplo mais simples vou fazer apenas com primeiro byte

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var kodomd5: array [1 .. 17] of byte;
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
       DCP_md51.Final(kodomd5);
       Edit2.Text := inttostr(kodomd5[1]);
    end;
    pronto agora basta testar

    [​IMG]

    como podemos ver o primeiro byte do md5 da palavra kodo no kami é 42, porem se a gente olhar em um site online ou em algum programa que gera md5 vamos ver que a palavra kodo no kami ia gerar a hash 2a00000f26850f4346defef229ea0735 ou seja o primeiro byte ali é "2a" e nao "42", isso acontece por que a gente esta usando base10 no caso decimal e ali no site esta usando base16 ou seja hexadecimal em outras palavra 42 em decimal é equivalente a 2a em hexadecimal, para comprovar isso podemos usar a calculadora do windows em modo programador no caso basta a gente colocar o numero em decimal depois modificar para hexadecimal que ele vai converter de uma base para outra automaticamente

    [​IMG]

    para a gente fazer isso no nosso codigo no caso converter de decimal para hexadecimal podemos usar o format que alem de converter ele vai retornar como string ou seja nao vamos precisar do inttostr, para usar o format usamos uma string que sera a formatação (nesse caso é %x) e entre colchetes usamos o numero

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var kodomd5: array [1 .. 17] of byte;
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
       DCP_md51.Final(kodomd5);
       Edit2.Text := format('%x',[kodomd5[1]]);
    end;
    [​IMG]

    agora temos que fazer isso com os outros bytes tambem no caso do md5 sao 16bytes, no caso podemos fazer dessa forma (lembrando que temos que atribuir a edit para ele mesmo se nao sera apagado e nao concatenado o byte anterior

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var kodomd5: array [1 .. 17] of byte;
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
       DCP_md51.Final(kodomd5);
       Edit2.Text := format('%x',[kodomd5[1]]);
       Edit2.Text := Edit2.Text + ' ' + format('%x',[kodomd5[2]]);
       Edit2.Text := Edit2.Text + ' ' + format('%x',[kodomd5[3]]);
       Edit2.Text := Edit2.Text + ' ' + format('%x',[kodomd5[4]]);
       ...
       Edit2.Text := Edit2.Text + ' ' + format('%x',[kodomd5[16]]);
    end;
    porem programador que é programador é preguiço por natureza e tambem viciado em cafeina kkk, com isso vamos automatizar aquilo com um loop while, mesmo por que md5 temos que refazer aquele trecho ali 16 vezes ja hash de 512bits como sha512 temos que fazer 64 vezes que daria um baita trabalho kkk, nao vou explicar muito sobre loops mesmo por que isso é o basico de pascal (caso tenha duvida recomendo da uma olhada no meu ebook de pascal na pagina 36)

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    var kodomd5: array [1 .. 17] of byte;
        cont: integer;
    begin
       DCP_md51.Init;
       DCP_md51.UpdateStr(edit1.Text);
       DCP_md51.Final(kodomd5);
       Edit2.Text := format('%x',[kodomd5[1]]);
       cont := 2;
       while cont <= 16 do
       begin
          Edit2.Text := Edit2.Text + ' ' + format('%x',[kodomd5[cont]]);
          inc(cont,1);
       end;
    end;
    [​IMG]

    bom galera as outras hashs é exatamente igual a unica diferença é o tamanho dela como tambem é possivel instanciar o objeto sem precisar do componente em si ou fazer através de stream de um arquivo para criar um programa de checksum porem nao vou abordar isso, esquecendo a hash vamos ver como usa criptografia no caso como hash basta aprender de uma que as outras são parecidas, para começar criei um nova aplicação nela coloquei dois Memo um vai ser o texto puro e outro vai ser gerado ele criptografado, um edit que sera onde vamos escrever a senha, dois buttons sendo um para criptografar e outro para descriptografar, tambem coloquei dois componente um vai ser a criptografia que eu escolhi 3des e outro vai ser um hash que eu escolhi md5 (é necessario uma hash)

    [​IMG]

    para começar vamos criptografar entao no evento onclick do botao que vai criptografar temos que inicializar como fizemos na hash porem no caso da criptografia temos que passar a senha e o tipo de hash, para passar a senha como uma string usamos o metodo InitStr e nele passamos como argumento a senha como string (nesse caso o edit) e por fim o tipo da hash (que no meu caso é o md5 no caso TDCP_md5)

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       DCP_3des1.InitStr(Edit1.Text, TDCP_md5);
    end;
    agora usamos o metodo EncrptString e nele passamos como argumento o texto que vai ser criptografado (no caso o texto dentro do primeiro memo), sendo o retorno desse metodo é o texto criptografado (com isso podemos atribuir o retorno direto para o segundo memo), tambem limpamos o segundo memo toda vez que apertamos no botao com o metodo clear

    Código (Forge Crash):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       DCP_3des1.InitStr(Edit1.Text, TDCP_md5);
       Memo2.Lines.Clear;
       Memo2.Lines.Add( DCP_3des1.EncryptString(Memo1.Lines.Text));
    end;
    [​IMG]

    para descriptografar fazemos o mesmo esquema anterior porem no botao que vai descriptografar e usamos o metodo DecryptString

    Código (Forge Crash):
    procedure TForm1.Button2Click(Sender: TObject);
    begin
       DCP_3des1.InitStr(Edit1.Text, TDCP_md5);
       Memo2.Lines.Clear;
       Memo2.Lines.Add( DCP_3des1.DecryptString(Memo1.Lines.Text));
    end;
    [​IMG]

    bom galera esse tutorial termina aqui e lembrando mesmo eu tenha usado o delphi o mesmo pode ser feito com lazarus sem mudar quase nada, alem do mais tem muita utilidade usar criptografia em seus projetos principalmente na parte de segurança, entao sempre recomendo aprender um pouco sobre criptoanalise \o

    by kodo no kami
     

Compartilhe esta Página