Ir para o conteúdo

Encriptador / Desencriptador

Cá fica mais uma pequena unit para ser usada por quem dela precise.

Está preparada para usar em delphi, mas facilmente poderá ser adaptada para usar em Free Pascal.

unit Cryptic;

// UNIT Cryptic
// - Permite Encriptar e Desencriptar um texto
// - Permite o uso de uma chave fixa ou aleatória (chave Integer)
// - A chave é passada junto com o código (e também ela codificada) para
//   posterior desencriptação
// - Pode ser usada de forma encadeada para maior segurança
// - O número de encadeamentos não é passado junto com a chave, pelo que, quando
//   se usa codificação encadeada, é necessário saber o número de encadeamentos
//   para se proceder à desencriptação
// - Permite definir os limites inferior e superior da chave aleatória (por
//   defeito a chave é escolhida aleatoriamente entre 1 e 255)
//   Para isso, basta definir o valor das variável LowLimit e HighLimit(1-65535)
//
// Encriptação (uso):
//   Encrypt (Texto:String);  - Encripta o texto com chave variável
//   Encrypt (Texto:String; Chave:Integer);  - Encripta o texto com a chave
//                                             inserida
//
// Desencriptação (uso):
//   Decrypt (Texto:String);  - Desencripta o texto
//   Decrypt (Texto:String; var Chave:Integer);  - Desencripta o texto e guarda
//                                             na segunda variável a chave usada
//                                             para encriptar
//
// por:  Nuno Picado (Portugal@Programar)


interface

uses
    Classes,SysUtils;

const
     DefaultLowLimit  =   1;
     DefaultHighLimit = 255;

var
   LowLimit  : Word = DefaultLowLimit;
   HighLimit : Word = DefaultHighLimit;

Function Encrypt(Text:String;Key:Integer):String;Overload;
Function Encrypt(Text:String):String;Overload;
Function Decrypt(Text:String;var Key:Integer):String;Overload;
Function Decrypt(Text:String):String;Overload;

implementation

Function Encrypt(Text:String;Key:integer):String;Overload;
var
   i:integer;
   Cript:String;
   lst:TStringList;
begin
     // Termina se o Texto a encriptar for nulo
     if Text='' then exit;

     // Prepara uma lista de apoio aos cálculos
     lst:=TStringList.Create;
     try
        lst.Clear;

        // Converte os caracteres em códigos ASCII e aplica-lhes a chave
        for i:=1 to length(Text) do
            lst.Add(IntToStr(Ord(Text[i])+Key));

        // Codifica a chave usando os códigos do primeiro e último caracter do texto, e insere o caracter resultante na segunda posição da lista
        Key:=StrToInt(lst[0])+StrToInt(lst[lst.Count-1])-Key;
        lst.Insert(1,IntToStr(Key));

        // Converte os códigos ASCII com a chave aplicada numa string codificada
        Result:='';
        for i:=0 to lst.count-1 do
            Result:=Result+Chr(StrToInt(lst[i]));
     finally
        lst.Free;  // Elimina a lista temporaria
     end;
end;

Function Encrypt(Text:String):String;Overload;
var
   Tmp:integer;
begin
     // Termina se o Texto a encriptar for nulo
     if Text='' then exit;

     // Valida os valores limite da chave, e ajusta-os se necessário
     if LowLimit<DefaultLowLimit
        then LowLimit:=DefaultLowLimit;
     if LowLimit=HighLimit
        then if LowLimit>1
                then LowLimit:=DefaultLowLimit
                else HighLimit:=DefaultHighLimit;
     if LowLimit>HighLimit
        then begin
                  Tmp:=LowLimit;
                  LowLimit:=HighLimit;
                  HighLimit:=Tmp;
             end;

     // Chama a função de encriptação com uma chave aleatória
     Randomize;
     Result:=Encrypt(Text,Random(HighLimit+LowLimit)+LowLimit);
end;

Function Decrypt(Text:String;var Key:Integer):String;
var
   lst:TStringList;
   i:integer;
begin
     // Termina se o Texto a encriptar for nulo
     if Text='' then exit;

     // Prepara uma lista de apoio aos cálculos
     lst:=TStringList.Create;
     try
        lst.Clear;

        // Adiciona à lista os códigos ASCII dos caracteres codificados
        for i:=1 to length(Text) do
            lst.Add(IntToStr(Ord(Text[i])));

        // Extrai a chave codificada da segunda posição da lista.
        Key:=StrToInt(lst[1]);
        // Descodifica a chave usando os códigos da primeira e ultimas posições
        Key:=StrToInt(lst[0])+StrToInt(lst[lst.Count-1])-Key;
        // Elimina a chave da lista
        lst.Delete(1);

        // Remove a chave de cada código, e converte o resultado em caracter, armazenando cada um no resultado
        Result:='';
        for i:=0 to lst.Count-1 do
            Result:=Result+Chr(StrToInt(lst[i])-Key);
     finally
        lst.Free;  // Elimina a lista temporaria
     end;
end;

Function Decrypt(Text:String):String;Overload;
var
   Key:integer;
begin
     // Termina se o Texto a encriptar for nulo
     if Text='' then exit;

     // Chama a função de desencriptação com uma variável para receber a chave usada que será ignorada
     Result:=Decrypt(Text,Key);
end;

end.

A explicação de funcionamento está nos comments iniciais da unit, mas alguma dúvida, é só dizer... ;-)

Implementação

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Cryptic;

var
   Texto,
   TextoEncriptado:String;
   Chave:Integer;

begin
  try
    // Encriptar com chave Aleatória
    Write('Texto a encriptar com chave aleatoria: ');
    Readln(Texto);
    TextoEncriptado:=Encrypt(Texto);
    Writeln(#13,'Texto encriptado:');
    Writeln(TextoEncriptado,#13#10);

    // Desencriptar (e verificando a chave)
    Writeln('Texto desencriptado:');
    Writeln(Decrypt(TextoEncriptado,Chave));
    Writeln('Chave aleatória gerada: ',Chave);

    // Encriptar com chave fixa
    Write('Texto a encriptar com chave fixa: ');
    Readln(Texto);
    Write('Chave fixa a usar: ');
    Readln(Chave);
    TextoEncriptado:=Encrypt(Texto,Chave);
    Writeln(#13,'Texto encriptado:');
    Writeln(TextoEncriptado,#13#10);

    // Desencriptar (sem verificar a chave)
    Writeln('Texto desencriptado:');
    Writeln(Decrypt(TextoEncriptado));
    Writeln('Chave aleatória gerada: ',Chave);

    // Mudar os valores de limite baixo e alto
    Write('Insira um novo limite baixo para a chave (1 a 65534): ');
    Readln(LowLimit);
    Write('Insira um novo limite alto para a chave (',LowLimit,' a 65535): ');
    Readln(HighLimit);

    // Encriptar com chave Aleatória
    Write('Texto a encriptar com chave aleatoria: ');
    Readln(Texto);
    TextoEncriptado:=Encrypt(Texto);
    Writeln(#13,'Texto encriptado:');
    Writeln(TextoEncriptado,#13#10);

    // Desencriptar (e verificando a chave)
    Writeln('Texto desencriptado:');
    Writeln(Decrypt(TextoEncriptado,Chave));
    Writeln('Chave aleatória gerada: ',Chave);


    Writeln(#13#13#13#10,'Enter para terminar. . .');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.