SHA-512 возвращает NULL, даже используя 2 DLL (ssleay32.dll и libeay32.dll) - PullRequest
0 голосов
/ 14 ноября 2018

Моя окружающая среда:

  • C ++ Builder XE4
  • с использованием компонента VCL
  • Indy 10.6.0.4975

Я учился виспользуйте MD5, SHA-1 и SHA-2.

Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IdHashSHA.hpp> // SHA-1, SHA-2
#include <IdHashMessageDigest.hpp> // for MD5
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String msg;
    msg = L"Hello, world";
    String hash;

    // 1. MD5
    TIdHashMessageDigest5 *md5;
    md5 = new TIdHashMessageDigest5();
    //
    hash = md5->HashStringAsHex(msg, IndyTextEncoding(TEncoding::ASCII)).LowerCase();
    Memo1->Lines->Add(L"MD5: " + hash);
    delete md5;

    // 2. SHA-1
    TIdHashSHA1 *sha1;
    sha1 = new TIdHashSHA1();
    //
    hash = sha1->HashStringAsHex(msg, IndyTextEncoding(TEncoding::ASCII)).LowerCase();
    Memo1->Lines->Add(L"SHA-1:" + hash);
    delete sha1;

    // 3. SHA-2 (SHA-512)
    TIdHashSHA512 *sha512;
    sha512 = new TIdHashSHA512();
    //
    hash = sha512->HashStringAsHex(msg, IndyTextEncoding(TEncoding::ASCII)).LowerCase();
    Memo1->Lines->Add(L"SHA-512:" + hash);
    delete sha512;
}
//---------------------------------------------------------------------------

Результат выглядит следующим образом.

enter image description here

Затем я нашелследующее:

TidHashSHA512.isavailable является ложным в Windows 10

В соответствии с предложением я добавляю два файла, где существует файл .exe:

  • ssleay32.dll
  • libeay32.dll

Тем не менее SHA-512 возвращает значение NULL.

Чего мне не хватает?

1 Ответ

0 голосов
/ 14 ноября 2018

10.6.0.4975 - ОЧЕНЬ старая версия Indy 10. Текущая версия - 10.6.2.5485.Вам нужно обновить.

В любом случае Indy 10 имеет встроенные реализации MD5 и SHA-1, которые вообще не полагаются на какую-либо внешнюю библиотеку хеширования.Но SHA-512 делает.Тем не менее, вы не указываете Indy, какую библиотеку хеширования использовать, такую ​​как OpenSSL.Вы не указываете Indy загружать библиотеки DLL OpenSSL, чтобы он мог инициализировать себя для использования функциональности OpenSSL SHA-512.Таким образом, sha512->IsAvailable возвращает false, а sha512->HashStringAsHex() возвращает пустую строку 1 .

Это четко указано в принятом ответе на вопрос, который вы связали с :

Indy предоставляет реализацию, использующую функции хеширования из OpenSSL.Чтобы использовать его, вы можете:

  • добавить модуль IdSSLOpenSSLHeaders в предложение uses, а затем вызвать его Load() функцию во время выполнения.

  • добавить модуль IdSSLOpenSSL в предложение uses, а затем вызвать его LoadOpenSSLLibrary() функцию во время выполнения.

В этом случае, так каквы используете C ++ вместо Pascal, вам нужно вместо этого добавить в ваш код соответствующий оператор #include, либо #include <IdSSLOpenSSLHeaders.hpp> или #include <IdSSLOpenSSL.hpp>, и затем вы можете вызвать соответствующую функцию Load, например, в конструкторе вашей формы.

1: Кстати, вы должны использовать IndyTextEncoding_ASCII() вместо IndyTextEncoding(TEncoding::ASCII).

...