SHA-512即使使用2个DLL(ssleay32.dll和libeay32.dll)也会返回NULL

时间:2018-11-14 03:01:09

标签: c++builder indy sha2

我的环境:

  • C ++ Builder XE4
  • 使用VCL组件
  • 印第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 is false on Windows 10

根据建议,我将两个文件添加到.exe文件所在的位置:

  • ssleay32.dll
  • libeay32.dll

仍然,SHA-512返回NULL。

我想念什么?

1 个答案:

答案 0 :(得分:2)

10.6.0.4975是Indy 10的非常旧的版本。当前版本是10.6.2.5485。您需要升级。

无论如何,Indy 10具有MD5和SHA-1的本机实现,它们根本不依赖任何外部哈希库。但是SHA-512可以。但是,您并没有告诉Indy使用哪个哈希库,例如OpenSSL。您不是在指示Indy加载OpenSSL DLL,以便它可以初始化自己以使用OpenSSL的SHA-512功能。这样,sha512->IsAvailable返回false,sha512->HashStringAsHex()返回空白字符串 1

这在accepted answerthe question you linked to中有明确说明:

  

Indy提供了一种使用OpenSSL哈希函数的实现。要使用它,您可以:

     
      
  • IdSSLOpenSSLHeaders单元添加到uses子句中,然后在运行时调用其Load()函数。

  •   
  • IdSSLOpenSSL单元添加到uses子句中,然后在运行时调用其LoadOpenSSLLibrary()函数。

  •   

在这种情况下,由于您使用的是C ++而不是Pascal,因此需要在代码中添加相应的#include#include <IdSSLOpenSSLHeaders.hpp>语句,然后您可以调用相关的#include <IdSSLOpenSSL.hpp>函数,例如在Form的构造函数中。

1:顺便说一句,您应该使用Load而不是IndyTextEncoding_ASCII()