كيف يمكن تشفير النصوص بأستخدام win API
#1
لماذا لا يعمل هذا الكود على دلفي 7
مطلوب تحصيح الكود

كود :
function Digest(Str1, Passward: string): string; const aMicrosoftEnhan = 'Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider'; var hProv: HCRYPTPROV; hHash: HCRYPTHASH; hKey: HCRYPTKEY; hHmacHash: HCRYPTHASH; pbHash: PByte; dwDataLen: DWORD; KeyAsByte: PByte; CommandAsByte: PByte; HmacInfo: HMAC_INFO; i: integer; Key: ansistring; // Decoder: TIdDecoderMIME; // Uri: TidUri; // Encoding: TEncoding; Firma: string; // Encoder: TIdEncoderMIME; begin hProv := 0; hHash := 0; hKey := 0; hHmacHash := 0; pbHash := nil; dwDataLen := 0; // Decoder := TIdDecoderMIME.Create; // Uri := TidUri.Create(Url); // Encoding := TEncoding.Create; // Encoder := TIdEncoderMIME.Create; try // Key := StringReplace(Base64Key, '-', '+', [rfReplaceAll]); // Key := StringReplace(Key, '_', '/', [rfReplaceAll]); KeyAsByte :=PByte(Str1); //PByte(Decoder.DecodeBytes(Key)); CommandAsByte :=PByte(Passward) ;//PByte(Encoding.ASCII.GetBytes(Uri.GetPathAndParams)); ZeroMemory(@HmacInfo, sizeof(HmacInfo)); HmacInfo.HashAlgid := CALG_MD5; if not CryptAcquireContext(@hProv, nil, aMicrosoftEnhan, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then raise ESysError.Create('Error in AcquireContext'); if not CryptCreateHash(hProv, CALG_MD5, 0, 0, @hHash) then raise ESysError.Create('Error in CryptCreateHash'); if not CryptHashData(hHash, @KeyAsByte[0], sizeof(KeyAsByte), 0) then raise ESysError.Create('Error in CryptHashData'); if not CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, @hKey) then raise ESysError.Create('Error in CryptDeriveKey'); if not CryptCreateHash(hProv, CALG_HMAC, hKey, 0, @hHmacHash) then raise ESysError.Create('Error in CryptCreateHash'); if not CryptSetHashParam(hHmacHash, HP_HMAC_INFO, @HmacInfo, 0) then raise ESysError.Create('Error in CryptSetHashParam'); if not CryptHashData(hHmacHash, @CommandAsByte[0], sizeof(CommandAsByte), 0) then raise ESysError.Create('Error in CryptHashData 0x%08x'); if not CryptGetHashParam(hHmacHash, HP_HASHVAL, nil, @dwDataLen, 0) then raise ESysError.Create('Error in CryptGetHashParam'); GetMem(pbHash, dwDataLen); if not CryptGetHashParam(hHmacHash, HP_HASHVAL, pbHash, @dwDataLen, 0) then raise ESysError.Create('Error in CryptGetHashParam'); Firma := ''; for i := 0 to dwDataLen - 1 do Firma := Firma + Format('%.2x', [pbHash[i]]); // Firma := Encoder.EncodeString(Firma); // Firma := StringReplace(Firma, '+', '-', [rfReplaceAll]); // Firma := StringReplace(Firma, '/', '_', [rfReplaceAll]); result := Firma; finally if hHmacHash <> 0 then CryptDestroyHash(hHmacHash); if hKey <> 0 then CryptDestroyKey(hKey); if hHash <> 0 then CryptDestroyHash(hHash); if hProv <> 0 then CryptReleaseContext(hProv, 0); if pbHash <> nil then FreeMem(pbHash); (* Decoder.Free; Uri.Free; Encoding.Free; Encoder.Free; *) end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text := 'Key=' + Digest(Edit1.Text, Edit2.Text); end;
الرد
#2
use:Wcrypt2
الرد
#3
السلام عليكم
مادا تريد ان تفعل بالضبط
تشفير أم حساب هاش
وما نوعه
التشفير أو الهاش
الرد
#4
ان قلت تشفير فأن TEncoding غير موجود في d7
مطلوب الهاش الناتج من هذه العملية

هنا المشكلة
إقتباس : for i := 0 to dwDataLen - 1 do
Firma := Firma + Format('%.2x', [pbHash[i]]);
d7 لايعتبر pbHash كا array
الرد
#5
إقتباس :use:Wcrypt2
ابحث عن المكتبة ضمن مشروع Jedi
كود :
http://www.delphi-jedi.org/
أو في النت:
كود :
http://www.google.com/codesearch#dzv7oUzpA6Y/trunk/TVScanner2007.D2006%20V1.0.1.2/componenten/EmbeddedWB_D2005/Source/Wcrypt2.pas&q=HCRYPTPROV%20lang:^pascal$&type=cs
الرد
#6
المكتبة موجودة ضمن المثال
المشكلة هنا
إقتباس :pbHash: PByte;
في DXE يقوم بوضائف كثيرة (كا array) لكن في D7 لا

التوابع تعمل بشكل جيد
ينبغي تحويل PByte
TpbHash:array of PByte;

وهنا تتوجب ال****** منكم
تحياتي
الرد
#7
هذا المثال رفعته لكم لمن يريد المحاولة


الملفات المرفقة
.7z   HMAC HASH.7z (الحجم : 132.63 ك ب / التحميلات : 46)
الرد


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


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