Si está buscando hacer criptografía en Pascal en el brazo, PowerPC u otras plataformas exóticas, ha venido al lugar correcto. Si eres un usuario de Delphi o quieres usar cifras y algoritmos hash más modernos como SHA-3, eche un vistazo al repositorio oficial de DEC.
El Compendium de cifrado de Delphi (DEC) es una biblioteca criptográfica para Delphi, C ++ Builder y Free Pascal. Fue desarrollado originalmente por Hagen Reddmann, hecho compatible con Delphi 2009 por Arvid Winkelsdorf, y ahora ha sido portado a Pascal libre.
Se han realizado los siguientes cambios con respecto al lanzamiento de 2008:
Se han probado los siguientes entornos:
Técnicamente, Delphi 7+ y FPC 2.6+ deben ser compatibles (posiblemente cambios muy menores necesarios para versiones antiguas).
Este proyecto tiene licencia bajo una licencia MIT/Freeware. Usted es libre de usar la biblioteca para uso personal y comercial, pero bajo su propio riesgo. Vea la licencia para más detalles.
DEC consiste principalmente en las siguientes unidades:
Además, se incluye el proyecto Dectest, que proporciona casos de prueba para todos los algoritmos.
El DEC original también contenía las unidades ASN1 y TypeInfoEx: esas no son necesarias para la funcionalidad central de DEC y no se han portado. Si los necesita, obténlos de una versión anterior.
Consulte Deccipher.pas para obtener más detalles sobre estos modos.
const
STATIC_KEY: array[0..15] of Byte = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
var
IV: array[0..15] of Byte;
Plaintext: Binary;
Ciphertext: TBytes;
begin
RandomSeed;
Plaintext := 'abcdefghijklmnopqrstuvwxyz';
with TCipher_Rijndael.Create do
try
Mode := cmCBCx;
RandomBuffer(IV, 16);
Init(STATIC_KEY, 16, IV, 16);
SetLength(Ciphertext, Length(Plaintext));
Encode(Plaintext[1], Ciphertext[0], Length(Plaintext));
Done; // only needed when same object will be used for further operations
FillChar(Plaintext[1], Length(Plaintext), 0);
Decode(Ciphertext[0], Plaintext[1], Length(Ciphertext));
Assert(Plaintext = 'abcdefghijklmnopqrstuvwxyz');
finally
Free;
end;
end;
NOTA: Si el texto sin formato no está acolchado, ¿DEC se enfrentará al último bloque truncado con CFB8! El relleno PKCS no es compatible con Dec. El uso de DEC en conjunto con otras bibliotecas criptográficas es, por supuesto, posible, pero debe asegurarse de preprocesar (es decir, la almohadilla) el texto sin formato correctamente.
Nota también: El tipo binario de DEC se define como RawByTestring. Si está en un entorno Unicode (por ejemplo, Delphi 2009+), se recomienda el cuidado cuando se trata de variables de string tipo. ¡Nunca los pase directamente a una función que tome binario!
var
InputBuf: TBytes;
InputRawStr, Hash: Binary;
begin
SetLength(InputBuf, 4);
FillChar(InputBuf[0], 4, $AA);
Hash := THash_SHA256.CalcBuffer(InputBuf[0], 4, TFormat_MIME64);
// -> 2+0UzrAB0RDXZrkBPTtbv/rWkVR1qboHky0qwFeUTAQ=
InputRawStr := 'My message';
Hash := THash_SHA256.CalcBinary(InputRawStr, TFormat_HEXL);
// -> acc147c887e3b838ebf870c8779989fa8283eff5787b57f1acb35cac63244a81
Hash := THash_SHA256.CalcBinary(InputRawStr, TFormat_Copy);
// -> Hash contains ac c1 47 ... raw bytes. Can be copied to a 32 bytes array using Move(Hash[1], HashBytes[0], 32);
end;
Cada clase hash también tiene funciones llamadas KDF2 y KDFX para la derivación de clave (por ejemplo, para usar como claves de sesión en cifrados).
Writeln(TFormat_MIME64.Encode('My message'));
// -> TXkgbWVzc2FnZQ==
Writeln(TFormat_MIME64.Decode('TXkgbWVzc2FnZQ=='));
// -> My message
Writeln(TFormat_PGP.Encode('Hello, how are you today?'));
// -> SGVsbG8sIGhvdyBhcmUgeW91IHRvZGF5Pw== <line break> =nUAA
Code y Decode están sobrecargados para tomar también un búfer de entrada sin tipo.