DCPcrypt son unos estupendos componentes de código abierto escritos por David Barton. Pueden conseguirse gratuitamente en la página Web del autor: www.cityinthesky.co.uk
Con los componentes vienen ejemplos y documentación. La verdad es que son bastante sencillos de utilizar. Empero, la siguiente unidad, junto con los componentes que he mencionado, permite hacer un uso de los mismos más o menos sencillo.
Es posible, como se verá, cifrar y descifrar archivos y cadenas, con dos funciones, disponiendo de todos los "Ciphers" y "Hashes" incluidos en los componentes susomentados.
De todos modos no quiero dejar de decir que dichos componentes dan bastante más de sí, y que el siguiente código fuente podría ser una especie de "ejemplo de uso" de los mismos, pero, que no cubre todas sus posibilidades.
Código Delphi
[-]
unit UCifrador;
interface
function Cifrar(cadena, password: string; algoritmo,
hash: byte; descifrar: boolean) : string; overload;
function Cifrar(archivo, destino, password: string;
algoritmo, hash: byte; descifrar: boolean): boolean;
overload;
implementation
uses
Classes,
SysUtils,
DCPconst, DCPcrypt2, DCPblockciphers, DCPblowfish,
DCPsha512, DCPcast128, DCPcast256, DCPidea, DCPice,
DCPdes, DCPrc6, DCPrc5, DCPrc4, DCPrc2, DCPmisty1,
DCPmars, DCPtwofish, DCPtea, DCPserpent, DCPrijndael,
DCPtiger, DCPsha256, DCPsha1, DCPripemd160, DCPmd5,
DCPmd4, DCPhaval, DCPripemd128;
procedure IniciarCifrador(var C: TDCP_Cipher;
algoritmo, hash: byte; password: string);
begin
case algoritmo of
DCP_tea: C := TDCP_tea.Create(nil);
DCP_des: C := TDCP_des.Create(nil);
DCP_ice: C := TDCP_ice.Create(nil);
DCP_rc2: C := TDCP_rc2.Create(nil);
DCP_rc4: C := TDCP_rc4.Create(nil);
DCP_rc5: C := TDCP_rc5.Create(nil);
DCP_rc6: C := TDCP_rc6.Create(nil);
DCP_3des: C := TDCP_3des.Create(nil);
DCP_ice2: C := TDCP_ice2.Create(nil);
DCP_idea: C := TDCP_idea.Create(nil);
DCP_mars: C := TDCP_mars.Create(nil);
DCP_misty1: C := TDCP_misty1.Create(nil);
DCP_cast128: C := TDCP_cast128.Create(nil);
DCP_cast256: C := TDCP_cast256.Create(nil);
DCP_thinice: C := TDCP_thinice.Create(nil);
DCP_serpent: C := TDCP_serpent.Create(nil);
DCP_twofish: C := TDCP_twofish.Create(nil);
DCP_blowfish: C := TDCP_blowfish.Create(nil);
DCP_rijndael: C := TDCP_rijndael.Create(nil);
end;
case hash of
DCP_md4: C.InitStr(password, TDCP_md4);
DCP_md5: C.InitStr(password, TDCP_md5);
DCP_sha1: C.InitStr(password, TDCP_sha1);
DCP_haval: C.InitStr(password, TDCP_haval);
DCP_tiger: C.InitStr(password, TDCP_tiger);
DCP_sha256: C.InitStr(password, TDCP_sha256);
DCP_sha384: C.InitStr(password, TDCP_sha384);
DCP_sha512: C.InitStr(password, TDCP_sha512);
DCP_ripemd128: C.InitStr(password, TDCP_ripemd128);
DCP_ripemd160: C.InitStr(password, TDCP_ripemd160);
end;
end;
function Cifrar(cadena, password: string; algoritmo,
hash: byte; descifrar: boolean) : string;
var
C: TDCP_Cipher;
begin
Result := '';
C := TDCP_Cipher.Create(nil);
try
IniciarCifrador(C, algoritmo, hash, password);
if desCifrar then
Result := C.DecryptString(cadena)
else
Result := C.EncryptString(cadena);
C.Burn;
finally
C.Free;
end;
end;
function Cifrar(archivo, destino, password: string;
algoritmo, hash: byte; desCifrar: boolean) : boolean;
var
C: TDCP_Cipher;
fsOrigen, fsDestino: TStream;
begin
fsOrigen := TFileStream.Create(archivo, fmOpenRead);
fsDestino := TFileStream.Create(destino, fmCreate);
C := TDCP_Cipher.Create(nil);
try
try
IniciarCifrador(C, algoritmo, hash, password);
if desCifrar then
C.DecryptStream(fsOrigen, fsDestino, fsOrigen.Size)
else
C.EncryptStream(fsOrigen, fsDestino, fsOrigen.Size);
C.Burn;
Result := true;
except
Result := false;
end;
finally
C.Free;
fsOrigen.Free;
fsDestino.Free;
end;
end;
end.
Ejemplo de llamadas:
Código Delphi
[-]
uses
DCPconst, UCifrador;
procedure TForm1.Button1Click(Sender: TObject);
var
c: string;
s: string;
begin
c := 'claveparacifrar';
s := 'Cadena a cifrar';
s := Cifrar(s, c, DCP_blowfish, DCP_sha1, false);
ShowMessage(s);
s := Cifrar(s, c, DCP_blowfish, DCP_sha1, true);
ShowMessage(s);
end;