Leo*_*era 7 delphi cryptography sha1 delphi-xe
我正在实施XML数字签名.我从小步骤开始,所以现在我想解决SHA-1哈希的问题.
在SO中有很多关于此的问题:
......可能还有更多.但是,我正在使用Delphi XE.到目前为止,我已经试过的Lockbox 2(两个Songbeamer和Sourceforge的版本),锁箱3,DCPCrypto2和其他一些人(哈希值是一个易于使用的单位,使用Windows加密功能)
我准备了一个小型试验台,它给了我以下内容:
LockBox2
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
Run Code Online (Sandbox Code Playgroud)
LockBox3
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
Run Code Online (Sandbox Code Playgroud)
DCPCrypto2
FAILED: 1 ('abc')
Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5'
Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d'
FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')
Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014'
Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'
Run Code Online (Sandbox Code Playgroud)
哈希
Test 1 passes
Test 2 passes
Run Code Online (Sandbox Code Playgroud)
您是否已成功在Delphi XE下编译提到的库并使它们具有适当的值?我对DCPCrypt2 SelfTest程序特别感兴趣.
编辑:我已经用固定的源代码添加了这个答案.谢谢大家的帮助,非常感谢.
RRU*_*RUZ 26
莱昂纳多,我认为UNICODE当你使用函数散列你的问题时,你的问题是string传递一个字节的数组(缓冲区).所以当您abc在Delphi XE中传递字符串时,您正在散列这样的缓冲区61 00 62 00 63 00(十六进制表示)
检查此示例应用程序,该应用程序使用Jwscl library(JEDI Windows安全代码库)中的Windows加密函数
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.
Run Code Online (Sandbox Code Playgroud)
这回归
abc AnsiString类型
A9993E364706816ABA3E25717850C26C9CD0D89D
abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq AnsiString类型
84983E441C3BD26EBAAE4AA1F95129E5E54670F1 for
abc 统一
9F04F41A848514162050E3D68C1A7ABB441DC2B5
abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq 统一
51D7D8769AC72C409C5B0E3F69C60ADC9A039014
Bar*_*lly 19
我的Cygwin命令提示符告诉我确实是Unicode让你感到困惑:
~$ printf 'a\0b\0c\0' | sha1sum
9f04f41a848514162050e3d68c1a7abb441dc2b5 *-
~$ printf 'abc' | sha1sum
a9993e364706816aba3e25717850c26c9cd0d89d *-
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14622 次 |
| 最近记录: |