PDA

Ver la Versión Completa : Cifrar y descifrar archivos y cadenas con DCPcrypt


dec
21-06-2006, 20:53:41
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.


unit UCifrador;

interface

{ Declaraciones públicas
}
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,

{ DCPcrypt v2.0 written by David Barton
(http://www.cityinthesky.co.uk/)
}
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;

{ Procedimiento auxiliar privado
}
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;

{ Cifrar o descifrar cadenas
}
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;

{ Cifrar o descifrar archivos
}
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:


{
Vamos a cifrar y descifrar una cadena utilizando
el algoritmo "Blowfish" y el "hash" "SHA1".
}

uses
DCPconst, // Constantes
UCifrador; // Función Cifrar

procedure TForm1.Button1Click(Sender: TObject);
var
c: string;
s: string;
begin

// Clave (password) para el cifrado
c := 'claveparacifrar';

// Cadena a cifrar (por ejemplo)
s := 'Cadena a cifrar';

// Ciframos la cadena
s := Cifrar(s, c, DCP_blowfish, DCP_sha1, false);

// Mostramos la cadena "cifrada"
ShowMessage(s); // Muestra la cadena "s" cifrada

// Desciframos la cadena
s := Cifrar(s, c, DCP_blowfish, DCP_sha1, true);

ShowMessage(s); // Muestra "Cadena a cifrar"
// es decir, la cadena vuelta a descifrar...

end;