حساب md5 بأستخدام winAPI
#1
لماذا تظهر النتيجة خطا
استخدم DXE
PHP كود :
const
  
PROV_RSA_FULL = 1;
  
CRYPT_VERIFYCONTEXT = 4026531840;
  
CALG_MD5 = 32771;
  
HP_HASHVAL = 2;
  
ADVAPI32 = 'advapi32.dll';

type
  HCRYPTPROV 
= ULONG;
  
PHCRYPTPROV = ^HCRYPTPROV;
  
HCRYPTHASH = ULONG;
  
PHCRYPTHASH = ^HCRYPTHASH;
  
ALG_ID = ULONG;
  
HCRYPTKEY = ULONG;
  
PHCRYPTKEY = ^HCRYPTKEY;

function 
CryptAcquireContext(phProv: PHCRYPTPROV; pszContainer: PAnsiChar;
  
pszProvider: PAnsiChar; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall;
  
external ADVAPI32 name 'CryptAcquireContextA';
function 
CryptReleaseContext(hProv: HCRYPTPROV; dwFlags: DWORD): BOOL; stdcall;
  
external ADVAPI32 name 'CryptReleaseContext';
function 
CryptCreateHash(hProv: HCRYPTPROV; Algid: ALG_ID; hKey: HCRYPTKEY;
  
dwFlags: DWORD; phHash: PHCRYPTHASH): BOOL; stdcall;
  
external ADVAPI32 name 'CryptCreateHash';

function 
CryptHashData(hHash: HCRYPTHASH; const pbData: PBYTE; dwDataLen: DWORD;
  
dwFlags: DWORD): BOOL; stdcall; external ADVAPI32 name 'CryptHashData';

function 
CryptGetHashParam(hHash: HCRYPTHASH; dwParam: DWORD; pbData: PBYTE;
  
pdwDataLen: PDWORD; dwFlags: DWORD): BOOL; stdcall;
  
external ADVAPI32 name 'CryptGetHashParam';
function 
CryptDestroyHash(hHash: HCRYPTHASH): BOOL; stdcall;
  
external ADVAPI32 name 'CryptDestroyHash';

function 
CalcMD5(const AString: string): string;
var
  
hProv: HCRYPTPROV;
  
hHash: HCRYPTHASH;
  
pBuff, p: PBYTE;
  
i, ALen: Cardinal;
begin
  Result 
:= '';
  
pBuff := nil;
  if 
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL,
    
CRYPT_VERIFYCONTEXT) then
    
try
      if 
CryptCreateHash(hProv, CALG_MD5, 0, 0, @hHash) then
      begin
        
if CryptHashData(hHash, @AString[1], Length(AString), 0) then
        begin
          
if CryptGetHashParam(hHash, HP_HASHVAL, nil, @ALen, 0) then
          begin
            GetMem
(pBuff, ALen);
            
p := pBuff;
            if 
CryptGetHashParam(hHash, HP_HASHVAL, pBuff, @ALen, 0) then
              
for i := 1 to ALen do
              
begin
                Result 
:= Result + IntToHex(p^, 2);
                
Inc(p);
              
end;
          
end;
        
end;
      
end;
    finally
      if 
Assigned(pBuff) then
        FreeMem
(pBuff, ALen);
      
CryptDestroyHash(hHash);
      
CryptReleaseContext(hProv, 0);
    
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1
.Text := CalcMD5('delphi4arab');
end; 
الرد
#2
ممكن تصحيح لهذا الكود
ابحث عن مثال يستخدم HMAC hash


الملفات المرفقة
.rar   New Folder.rar (الحجم : 56.08 ك ب / التحميلات : 15)
الرد
#3
السلام عليكم
تم تصحيح المشروع
بالتوفيق


الملفات المرفقة
.rar   Project1.rar (الحجم : 72.51 ك ب / التحميلات : 69)
الرد
#4
انت صديقي من الان
100/100
سوف ادرس الكود وبالرد عليك
تحياتي
الرد
#5
اخي rami هذا الكود ليس D7
اي اصدار؟
الرد
#6
قمت بتعديله باستخدام xe
ولم اجربه في اصدار آخر
الرد
#7
اخي رامي ممكن تعدل في هذا المثال


الملفات المرفقة
.7z   all hash wapi.7z (الحجم : 85.62 ك ب / التحميلات : 23)
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم