我的环境:
我正在研究使用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文件所在的位置:
仍然,SHA-512返回NULL。
我想念什么?
答案 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 answer至the 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()
。