【问题标题】:SHA-512 returns NULL even using 2 DLLs (ssleay32.dll and libeay32.dll)即使使用 2 个 DLL(ssleay32.dll 和 libeay32.dll),SHA-512 也会返回 NULL
【发布时间】:2018-11-14 11:24:34
【问题描述】:

我的环境:

  • 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;
}
//---------------------------------------------------------------------------

结果如下。

然后,我发现了以下内容:

TidHashSHA512.isavailable is false on Windows 10

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

  • ssleay32.dll
  • libeay32.dll

不过,SHA-512 返回 NULL。

我错过了什么?

【问题讨论】:

    标签: c++builder indy sha2


    【解决方案1】:

    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-&gt;IsAvailable 返回 false,sha512-&gt;HashStringAsHex() 返回空白字符串 1

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

    Indy 提供了一个使用来自 OpenSSL 的散列函数的实现。要使用它,您可以:

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

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

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

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

    【讨论】:

    • 我忽略了您作为接受答案编写的程序。刚才,我可以按照这两个建议中的任何一个获得 SHA-512。我很感激。
    • 根据Indy的更新,我会研究XE4或者我会考虑使用Tokyo。
    • 也感谢您使用 IndyTextEncoding()。检查原因后,我会考虑使用它。
    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2013-06-17
    • 2012-12-17
    • 2017-09-18
    • 2018-05-12
    相关资源
    最近更新 更多