Olá, hoje gostaria de compartilhar alguns conceitos de criptografia.
No dia-a-dia, nos deparamos com a necessidade de ocultar certas informações em um sistema, para integridade e proteção das mesmas. Como por exemplo, a senha de um usuário que acessa o sistema, e até mesmo números de cartões de crédito e senhas bancárias de clientes. Pensando nisso, devemos ter sempre à mão, uma rotina, ou um esquema de criptografia, seja para sistemas de pequeno, médio ou grande porte.
Vamos criar agora uma rotina simples de criptografia, apenas para fins didáticos.
Primeiro abra seu Delphi, crie uma nova aplicação e insira no formulário principal: 2 Button e 2 Memo. Agora vá ao código de seu Form, e insira duas funções na seção implementation:

function FortalezaDigitalEncode(Texto: string): string;
const
  AlfaNumerico: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  i, x: Integer;
begin
  Texto := UpperCase(Texto);
  for i := 1 to Length(Texto) do
    if (Pos(Texto[i], AlfaNumerico) <> 0) then
      begin
        x := Pos(Texto[i], AlfaNumerico) - 1;
        if (x <= 0) then
          x := 23;
        Texto[i] := AlfaNumerico[x];
      end;
  Result := Texto;
end;

function FortalezaDigitalDecode(Texto: string): string;
const
  AlfaNumerico: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  i, x: Integer;
begin
  Texto := UpperCase(Texto);
  for i := 1 to Length(Texto) do
    if (Pos(Texto[i], AlfaNumerico) <> 0) then
      begin
        x := Pos(Texto[i], AlfaNumerico) + 1;
        if (x >= 23) then
          x := 1;
        Texto[i] := AlfaNumerico[x];
      end;
  Result := Texto;
end;

Vamos fazer um rápido comentário sobre o código. O nome das funções não foram escolhidos por acaso, vieram da obra de nome "Fortaleza Digital" de Dan Brown, que para quem não leu, eu indico, pois é uma ótima leitura. A primeira função, recebe uma string e substitui cada letra pela sua antecessora do alfabeto, ou seja, a letra D se torna C, a letra C se torna B, e assim por diante. Como a letra A não possui antecessora, ela se torna Z. A segunda função faz exatamente o contrátio, traduz um texto ilegível e confuso para algo legível, substituindo cada letra pela sua sucessora. Por Exemplo:

DevMedia: O maior portal de desenvolvimento do Brasil!!!

Ficaria assim:

CduLdchz: N lZhnq onpsZk cd cdrdmunkuhldmsn cn AqZrhk!!!

E ao usar a segunda função, volta a ser: DevMedia: O maior portal de desenvolvimento do Brasil!!! Simples e eficiente.

Após isso, dê um duplo-clique no Button1 e insira o seguinte código:

Memo2.Lines.Clear;
Memo2.Lines.Text := FortalezaDigitalEncode(Memo1.Lines.Text);
Memo1.Lines.Clear;

Da mesma forma, insira no Button2:

Memo1.Lines.Clear;
Memo1.Lines.Text := Fortaleza DigitalDecode(Memo2.Lines.Text);
Memo2.Lines.Clear;

Execute o programa e digite uma mensagem no Memo1, depois clique no Button1 e veja o resultado. Depois digite qualquer texto sem sentido no Memo2 e clique no Button2 para ver se o resultado faz sentido. É uma boa brincadeira, diga-se de passagem.

Podemos também declarar essas funções em uma dll, para otimizar seu funcionamento. Salve todos os seus arquivos, e crie um novo projeto de DLL (DLL Wizard). Substitua todo o texto do editor por este:

library Project1;

uses SysUtils, Classes;

const
  AlfaNumerico: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

function FortalezaDigitalEncode(Texto: string): string; export; stdcall;
var
  i, x: Integer;
begin
  for i := 1 to Length(Texto) do
    if (Pos(Texto[i], AlfaNumerico) <> 0) then
      begin
        x := Pos(Texto[i], AlfaNumerico) - 1;
        if (x <= 0) then
          x := 62;
        Texto[i] := AlfaNumerico[x];
      end;
  Result := Texto;
end;

function FortalezaDigitalDecode(Texto: string): string; export; stdcall;
var
  i, x: Integer;
begin
  for i := 1 to Length(Texto) do
    if (Pos(Texto[i], AlfaNumerico) <> 0) then
      begin
        x := Pos(Texto[i], AlfaNumerico) + 1;
        if (x >= 62) then
          x := 1;
        Texto[i] := AlfaNumerico[x];
      end;
  Result := Texto;
end;

exports FortalezaDigitalEncode;
exports FortalezaDigitalDecode;

begin
end.

Como você pode notar, não vamos usar o arquivo .RES, já que não necessitamos dele, e além disso, para facilitar, vamos colocar as funções direto no código do projeto. Além disso, essa função também aceita diferenca entre caracteres maísculos e minúsculos além de números. Fique à vontade para alterar a constante AlfaNumerico, acrescentando caracteres com acentos, pontuação entre outros caracteres. Salve o projeto e compile-o. Abra novamente seu projeto antigo, e na unit do formulário principal, retire as funções de encriptação e declare no final da seção interface, antes da palavra implementation:

function FortalezaDigitalDecode(Texto: string): string; stdcall;
  external 'Project1.dll';
function FortalezaDigitalEncode(Texto: string): string; stdcall;
  external 'Project1.dll';

Lembrando que a string após 'external' deve ser o nome da DLL, e de preferência que esteja na mesma pasta que o EXE de exemplo.

Agora, teste novamente e veja se o resultado foi o mesmo. Claro que por ser uma função muito simples, a diferença de otimização entre declarar a função na DLL ao invés do executável, se torna muito pequena, mas se criarmos um algoritmo de encriptação mais complexo, essa com certeza seria a melhor prática a ser utilizada. Mas vale a opinião de cada um. No meu caso, com o uso da DLL, o sistema ficou assim:

Sistema utilizando criptografia

Agora um desafio: decodificar esta mensagem e visitar o link que está nela:


PtZmcn stcn drs� rnlaqhn, mZrbd tlZ drodqZm�Z...
Onq lZhr odptdmZ ptd rdiZ, m�n cdud rdq rtadrshlZcZ...
OqdoZqd-rd oZqZ dmsqZq mn lZqZuhkgnrn ltmcn cd 9hydm!!!

gsso://rdmshmdkZZhydm.aknfrons.bnl/

Boa sorte! Espero que tenham gostado dessa introdução. No próximo artigo, criaremos um algoritmo mais complexo que utiliza conceitos de biologia (transcrição e tradução do DNA), numerologia, e o clássico da matemática, a Fórmula de Báskara (para quem não se lembra, é bom dar uma revisada, hehe), além de nos aprofundarmos em conceitos dos algoritmos mais conhecidos e utilizados do mercado. Gostaria de saber a opinião de cada um, então fiquem à vontade para comentar este artigo, ou entrar em contato comigo pelo Twitter (http://twitter.com/geovanisouza92), MSN (gss6978@hotmail.com), ou mesmo e-mail para geovanisouza92@gmail.com, pois sempre é bom torcar ideias com outras pessoas.

Até a próxima e fiquem com Deus!