![]() |
AW: SHA! Unit gesucht
Mich wundert aber das hier viel mehr
Zitat:
|
AW: SHA! Unit gesucht
Ich meinte die Unit von Horst. Oder habe ich da eine entsprechende Funktion übersehen? Arhg. Ich habe sie übersehen.
|
AW: SHA! Unit gesucht
Ich weiß zwar nicht wo Horst0815 seine erste Unit her hat, aber der Selbsttest funktioniert ab D12 so nicht mehr! In meiner Unit steht
Delphi-Quellcode:
Sein
function SHA1SelfTest: boolean;
{-self test SHA1: compare with known value} const s1: string[3] = 'abc'; D1: TSHA1Digest= ($a9,$99,$3e,$36,$47,$06,$81,$6a,$ba,$3e,$25,$71,$78,$50,$c2,$6c,$9c,$d0,$d8,$9d);
Delphi-Quellcode:
ist ab D12 Unicode und SHA1SelfTest liefert false! Selbst wenn das falsche
s: string= 'abc';
Delphi-Quellcode:
durch
SHA1Update(Context,@s[1],length(s));
Delphi-Quellcode:
ersetzt würde, käme selbstverständlich ein anderer Testwert heraus!
SHA1Update(Context,@s[1],length(s)*sizeof(char));
|
AW: SHA! Unit gesucht
Was hälst Du von
![]() Sieht bei mir so aus:
Delphi-Quellcode:
Hinweis: Data muss so lang sein, dass die Hashes hineinpassen. Der Wert für dwDataLen kann von der Länge des Hashes bis zur Länge von Data liegen. Nach Aufruf von CryptGetHashParam enthält er die Länge des Hashes.
type
ULONG = Cardinal; ULONG_PTR = ^ULONG; THCRYPTPROV = ULONG; PTHCRYPTPROV = ULONG_PTR; LPCTSTR = PAnsiChar; PBYTE = ^Byte; ALG_ID = Cardinal; HCRYPTKEY = THandle; PHCRYPTKEY = HCRYPTKEY; PHCRYPTHASH = ULONG_PTR; const ALG_CLASS_HASH = 4 shl 13; ALG_TYPE_ANY = 0; ALG_SID_MD5 = 3; ALG_SID_SHA = 4; ALG_SID_SHA1 = ALG_SID_SHA; CALG_MD5 = ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_MD5; CALG_SHA1 = ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_SHA1; PROV_RSA_FULL = 1; CRYPT_NEWKEYSET = $08; HP_HASHVAL = $0002; NTE_BAD_KEYSET = HRESULT($80090016); function CryptAcquireContext(phProv: PTHCRYPTPROV; pszContainer, pszProvider: LPCTSTR; dwProvType, dwFlags: Cardinal): LongBool; stdcall; external 'Advapi32.dll' name 'CryptAcquireContextA'; function CryptCreateHash(hProv: THCRYPTPROV; Algid: ALG_ID; hKey: HCRYPTKEY; dwFlags: Cardinal; phHash: PHCRYPTHASH): LongBool; stdcall; external 'Advapi32.dll' name 'CryptCreateHash'; function CryptHashData(hHash: PHCRYPTHASH; pbData: PBYTE; dwDataLen, dwFlags: Cardinal): LongBool; stdcall; external 'Advapi32.dll' name 'CryptHashData'; function CryptGetHashParam(hHash: PHCRYPTHASH; dwParam: Cardinal; pbData: PBYTE; pdwDataLen: PCardinal; dwFlags: Cardinal): LongBool; stdcall; external 'Advapi32.dll' name 'CryptGetHashParam'; function CryptDestroyHash(hHash: PHCRYPTHASH): LongBool; stdcall; external 'Advapi32.dll' name 'CryptDestroyHash'; function CryptReleaseContext(hProv: THCRYPTPROV; dwFlags: Cardinal): LongBool; stdcall; external 'Advapi32.dll' name 'CryptReleaseContext'; function CreateHash(aString: AnsiString; aAlgoID: Cardinal): AnsiString; var hCryptProv : THCRYPTPROV; hHash : PHCRYPTHASH; dwDataLen : Cardinal; Data : Array[1..20] of Byte; i : Integer; begin { * http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886.aspx * Handle zum Provider Content. } if CryptAcquireContext(@hCryptProv, nil, nil, PROV_RSA_FULL, 0) or ((GetLastError = NTE_BAD_KEYSET) and CryptAcquireContext(@hCryptProv, nil, nil, PROV_RSA_FULL, CRYPT_NEWKEYSET)) then begin { * http://msdn.microsoft.com/en-us/library/windows/desktop/aa379908.aspx * Handle zum Hashobject. } if CryptCreateHash(hCryptProv, aAlgoID, 0, 0, @hHash) then begin { * http://msdn.microsoft.com/en-us/library/windows/desktop/aa380202.aspx * Daten übergeben. } CryptHashData(hHash, Pointer(PByte(aString)), Length(aString), 0); { * http://msdn.microsoft.com/en-us/library/windows/desktop/aa379947.aspx * Hash abholen. } FillChar(Data, SizeOf(Data), 0); // if aAlgoID = CALG_SHA1 then dwDataLen := 20; // if aAlgoID = CALG_MD5 then dwDataLen := 16; dwDataLen := 20; if CryptGetHashParam(hHash, HP_HASHVAL, @Data, @dwDataLen, 0) then begin { * Ergebnis übergeben } i := 1; Result := ''; while (Data[i] <> 0) and (i < dwDataLen + 1) do begin Result := Result + Chr(Integer(Data[i])); inc(i); end; end; { * [url]http://msdn.microsoft.com/en-us/library/windows/desktop/aa379917.aspx[/url] * Handle zum Hashobject freigeben. } if hHash <> nil then CryptDestroyHash(hHash); { * [url]http://msdn.microsoft.com/en-us/library/windows/desktop/aa380268.aspx[/url] * Den Content releasen. } if hCryptProv <> 0 then CryptReleaseContext(hCryptProv, 0); end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz