在Delphi XE中的SHA1散列 [英] SHA1 hashing in Delphi XE
问题描述
我正在实现XML数字签名。我现在开始只有一小步,所以现在我想解决SHA-1哈希的问题。
I'm in the process of implementing XML digital signatures. I'm starting with little steps, so right now I want to solve the problem of SHA-1 hashing.
在SO中有很多问题: p>
There are lots of questions about this in SO:
- Digitially Sign Key with Lockbox
- Encryption library for Delphi
- Convert this php digital signing to Delphi
- Delphi: is there a version of LockBox for Delphi-XE
- Delphi 2010 Cryptography libraries
...可能更多。但是,我使用Delphi XE。到目前为止,我试过LockBox 2(Songbeamer和Sourceforge版本),Lock Box 3,DCPCrypto2和其他一些( Hashes 是一个易于使用的单位,它使用Windows加密函数)
...and probably more. However, I'm using Delphi XE. So far, I've tried LockBox 2 (both the Songbeamer and Sourceforge versions), Lock Box 3, DCPCrypto2 and some others (Hashes is an easy to use unit which uses Windows crypto functions)
我准备了一个小测试台,它给我以下内容:
I prepared a small test rig that gives me the following:
LockBox2
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
LockBox3
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
DCPCrypto2
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
散列
Test 1 passes
Test 2 passes
您是否成功地在Delphi XE中编译了上述库并使它们给出了合适的值?我对 DCPCrypt2 SelfTest
程序特别感兴趣。
Have you succeeded in compile the mentioned libraries under Delphi XE and make them give the appropriate values? I'm particularly interested in DCPCrypt2 SelfTest
procedure.
/ strong>:我已将此答案添加到固定来源码。
Edit: I've added this answer with the fixed source code. Thank you all for your help, it is most appreciated.
推荐答案
Leonardo,我认为你的问题是 UNICODE
当你使用一个函数来散列 string
时,你传递一个数组(缓冲区)的字节。所以当你通过Delphi XE中的 abc
字符串时,你的哈希值为 61 00 62 00 63 00
(十六进制表示)
Leonardo, i think which your problem is the UNICODE
when you uses a function to hash a string
you are passing a array (buffer) of bytes. so when you pass the abc
string in Delphi XE, your are hashing a buffer like this 61 00 62 00 63 00
(Hex representation)
检查此示例应用程序,该应用程序使用来自 Jwscl库
代码Lib)
check this sample application which uses the Windows crypto functions from the Jwscl library
(JEDI Windows Security Code Lib)
program Jwscl_TestHash;
{$APPTYPE CONSOLE}
uses
JwsclTypes,
JwsclCryptProvider,
Classes,
SysUtils;
function GetHashString(Algorithm: TJwHashAlgorithm; Buffer : Pointer;Size:Integer) : AnsiString;
var
Hash: TJwHash;
HashSize: Cardinal;
HashData: Pointer;
i : Integer;
begin
Hash := TJwHash.Create(Algorithm);
try
Hash.HashData(Buffer,Size);
HashData := Hash.RetrieveHash(HashSize);
try
SetLength(Result,HashSize*2);
BinToHex(PAnsiChar(HashData),PAnsiChar(Result),HashSize);
finally
TJwHash.FreeBuffer(HashData);
end;
finally
Hash.Free;
end;
end;
function GetHashSHA(FBuffer : AnsiString): AnsiString;
begin
Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer));
end;
function GetHashSHA_Unicode(FBuffer : String): String;
begin
Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer)*SizeOf(Char));
end;
begin
try
Writeln(GetHashSHA('abc'));
Writeln(GetHashSHA('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'));
Writeln(GetHashSHA_Unicode('abc'));
Writeln(GetHashSHA_Unicode('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'));
Readln;
except
on E:Exception do
begin
Writeln(E.Classname, ':', E.Message);
Readln;
end;
end;
end.
此回报
ABC
AnsiString类型
abc
AnsiString
A9993E364706816ABA3E25717850C26C9CD0D89D
A9993E364706816ABA3E25717850C26C9CD0D89D
abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
AnsiString
abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
AnsiString
84983E441C3BD26EBAAE4AA1F95129E5E54670F1
84983E441C3BD26EBAAE4AA1F95129E5E54670F1 for
abc
的unicode
9F04F41A848514162050E3D68C1A7ABB441DC2B5
9F04F41A848514162050E3D68C1A7ABB441DC2B5
abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
的Unicode
51D7D8769AC72C409C5B0E3F69C60ADC9A039014
51D7D8769AC72C409C5B0E3F69C60ADC9A039014
这篇关于在Delphi XE中的SHA1散列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!