簡體   English   中英

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

[英]SHA-512 returns NULL even using 2 DLLs (ssleay32.dll and libeay32.dll)

我的環境:

  • 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在Windows 10上為false

根據建議,我將兩個文件添加到.exe文件所在的位置:

  • ssleay32.dll
  • libeay32.dll

盡管如此,SHA-512返回NULL。

我缺少什么?

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

您鏈接到的問題可接受答案中明確說明了這一點:

Indy提供了一種使用OpenSSL哈希函數的實現。 要使用它,您可以:

  • IdSSLOpenSSLHeaders單元添加到您的uses子句中,然后在運行時調用其Load()函數。

  • IdSSLOpenSSL單元添加到uses子句中,然后在運行時調用其LoadOpenSSLLibrary()函數。

在這種情況下,由於您使用的是C ++而不是Pascal,因此需要向代碼中添加相應的#include語句,即#include <IdSSLOpenSSLHeaders.hpp>#include <IdSSLOpenSSL.hpp> ,然后可以調用相關的Load函數,例如在Form的構造函數中。

1:順便說一句,您應該使用IndyTextEncoding_ASCII()而不是IndyTextEncoding(TEncoding::ASCII)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM