MD5 et SHA1 avec l’unité System::Hash

Dans un article précédent, j’avais montré comment calculer un hachage MD5 et SHA1 avec Indy. Je me suis rendu compte cette semaine qu’il existait depuis C++Builder XE8 une manière d’effectuer ces mêmes calculs sans avoir de dépendance sur la bibliothèque de communication Indy.

Tout d’abord, il faut ajouter le fichier d’en-tête suivant:

#include <System.Hash.hpp>

Pour MD5, il faut ce code:

String __fastcall TForm1::GetHashMD5(const String AFileName)
{
    System::Hash::THashMD5 LMd5 = System::Hash::THashMD5::Create();
    System::Classes::TFileStream* LFileStream = NULL;
    try
    {
        LFileStream = new System::Classes::TFileStream(AFileName,
            fmOpenRead | fmShareDenyWrite);
        System::DynamicArray<System::Byte> Buffer;
        Buffer.Length = LFileStream->Size;
        LFileStream->Read(&Buffer[0], Buffer.Length);
        LMd5.Update(Buffer);
    }
    __finally
    {
        delete LFileStream;
    }
    return LMd5.HashAsString().UpperCase();
}

Pour SHA1, on utilise ce code:

String __fastcall TForm1::GetHashSHA1(const String AFileName)
{
    System::Hash::THashSHA1 LSha1 = System::Hash::THashSHA1::Create();
    System::Classes::TFileStream* LFileStream = NULL;
    try
    {
        LFileStream = new System::Classes::TFileStream(AFileName,
            fmOpenRead | fmShareDenyWrite);
        System::DynamicArray<System::Byte> Buffer;
        Buffer.Length = LFileStream->Size;
        LFileStream->Read(&Buffer[0], Buffer.Length);
        LSha1.Update(Buffer);
    }
    __finally
    {
        delete LFileStream;
    }
    return LSha1.HashAsString().UpperCase();
}

Une nouvelle version de l’IDE, C++Builder 10 Seattle, est maintenant disponible. L’unité System::Hash a un nouveau membre. Il s’agit de THashSHA2. Il implémente la famille de fonctions de hachage SHA-2:

enum DECLSPEC_DENUM TSHA2Version : unsigned char { SHA224, SHA256, SHA384, SHA512, SHA512_224, SHA512_256 };