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.