Si vous cherchez à faire de la cryptographie à Pascal sur ARM, PowerPC ou d'autres plates-formes exotiques, vous êtes au bon endroit. Si vous êtes un utilisateur de Delphi ou si vous souhaitez utiliser des chiffres plus modernes et des algorithmes de hachage tels que SHA-3, veuillez jeter un œil au référentiel officiel de DEC.
Le Recryption de Delphi Compendium (DEC) est une bibliothèque cryptographique pour Delphi, C ++ Builder et Free Pascal. Il a été initialement développé par Hagen Reddmann, rendu compatible avec Delphi 2009 par Arvid Winkelsdorf, et a maintenant été porté à Free Pascal.
Les modifications suivantes ont été apportées à la version 2008:
Les environnements suivants ont été testés:
Techniquement, Delphi 7+ et FPC 2.6+ devraient être compatibles (éventuellement des changements très mineurs requis pour les anciennes versions).
Ce projet est concédé sous licence MIT / Freeware. Vous êtes libre d'utiliser la bibliothèque à usage personnel et commercial, mais à vos propres risques. Voir la licence pour plus de détails.
DEC se compose principalement des unités suivantes:
En outre, le projet DECTEST est inclus, qui fournit des cas de test pour tous les algorithmes.
Le DEC d'origine contenait également les unités ASN1 et TypeInfoex - celles-ci ne sont pas requises pour la fonctionnalité principale de Dec et n'ont pas été portées. Si vous en avez besoin, veuillez les obtenir d'une libération plus ancienne.
Vérifiez Deccipher.pas pour plus de détails sur ces modes.
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;
Remarque: Si le texte en clair n'est pas rembourré, DEC remplira le dernier bloc tronqué avec CFB8! Le rembourrage PKCS n'est pas pris en charge par Dec. L'utilisation de DEC en conjonction avec d'autres bibliothèques cryptographiques est bien sûr possible, mais vous devez vous assurer de prétraiter (c.-à-d. Pad) le texte en clair correctement.
Remarque également: le type binaire de DEC est défini comme RawBytestring. Si vous êtes dans un environnement Unicode (par exemple Delphi 2009+), les soins sont conseilés lorsqu'ils traitent des variables de string de type. Ne les passez jamais directement dans une fonction qui prend le binaire!
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;
Chaque classe de hachage a également des fonctions appelées KDF2 et KDFX pour la dérivation des clés (par exemple pour une utilisation comme touches de session dans les chiffres).
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
Encoder et le décodage sont tous deux surchargés pour prendre également un tampon d'entrée non type.