[英]SHA-512 returns NULL even using 2 DLLs (ssleay32.dll and libeay32.dll)
我的環境:
我正在研究使用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文件所在的位置:
盡管如此,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.