http://www.pellesoft.se/communicate/tips/tips.aspx?tid=1442 http://www.latiumsoftware.com/download/p0020.zip uses SHA1, Base64; function GetHashedBiosInfo: string; var SHA1Context: TSHA1Context; SHA1Digest: TSHA1Digest; begin // Get the BIOS data SetString(Result, PChar(Ptr($F0000)), $10000); // Hash the string SHA1Init(SHA1Context); SHA1Update(SHA1Context, PChar(Result), Length(Result)); SHA1Final(SHA1Context, SHA1Digest); SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest)); // Return the hash string encoded in printable characters Result := B64Encode(Result); end;
直接用Crypto很简单的,给你一个例子。 crypto的接口可以从delphi-jedi.org下到,ftp://delphi-jedi.org/api/CryptoAPI2.zip procedure TForm1.Button1Click(Sender: TObject); var B: array [0..1023] of Byte; HashResult: array [0..19] of Byte; HashLen: DWORD; hProv: HCRYPTPROV; hHash: HCRYPTHASH; I: Integer; begin for I := 0 to 1023 do B[I] := Trunc(Random(256)); if not CryptAcquireContext(@hProv, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) then Exit; try if not CryptCreateHash(hProv, CALG_SHA1, 0, 0, @hHash) then Exit; try if not CryptHashData(hHash, @B[0], 1024, 0) then Exit; HashLen := 20; if not CryptGetHashParam(hHash, HP_HASHVAL, @HashResult[0], @HashLen, 0) then Exit; finally CryptDestroyHash(hHash); end; finally CryptReleaseContext(hProv, 0); end; end;
TO 开心汪汪: 非常感谢,我在OPENSSL的下载中心里找到了这份文档,是个PDF,我仔细研究一下,另外您对我的留言中所提到的问题有任何见解吗?就是调用CryptAcquireContext函数时出错,用GETLASTERROR得到以后对照MSDN上的错误代码(MSDN上也有这个类库的介绍,我自己找到的),错误为NO_MEMORY,不知何故,所以我仍然不能使用这个库,我使用2003/D7编译.
seems that SHA1/MD5 is NO longer safe, professor Wang from Shandong University, China, has found some way to crash this two.
http://www.latiumsoftware.com/download/p0020.zip
uses SHA1, Base64; function GetHashedBiosInfo: string;
var
SHA1Context: TSHA1Context;
SHA1Digest: TSHA1Digest;
begin
// Get the BIOS data
SetString(Result, PChar(Ptr($F0000)), $10000);
// Hash the string
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, PChar(Result), Length(Result));
SHA1Final(SHA1Context, SHA1Digest);
SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest));
// Return the hash string encoded in printable characters
Result := B64Encode(Result);
end;
crypto的接口可以从delphi-jedi.org下到,ftp://delphi-jedi.org/api/CryptoAPI2.zip
procedure TForm1.Button1Click(Sender: TObject);
var
B: array [0..1023] of Byte;
HashResult: array [0..19] of Byte;
HashLen: DWORD;
hProv: HCRYPTPROV;
hHash: HCRYPTHASH;
I: Integer;
begin
for I := 0 to 1023 do B[I] := Trunc(Random(256));
if not CryptAcquireContext(@hProv, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) then Exit;
try
if not CryptCreateHash(hProv, CALG_SHA1, 0, 0, @hHash) then Exit;
try
if not CryptHashData(hHash, @B[0], 1024, 0) then Exit;
HashLen := 20;
if not CryptGetHashParam(hHash, HP_HASHVAL, @HashResult[0], @HashLen, 0) then Exit; finally
CryptDestroyHash(hHash);
end;
finally
CryptReleaseContext(hProv, 0);
end;
end;
非常感谢,我在OPENSSL的下载中心里找到了这份文档,是个PDF,我仔细研究一下,另外您对我的留言中所提到的问题有任何见解吗?就是调用CryptAcquireContext函数时出错,用GETLASTERROR得到以后对照MSDN上的错误代码(MSDN上也有这个类库的介绍,我自己找到的),错误为NO_MEMORY,不知何故,所以我仍然不能使用这个库,我使用2003/D7编译.