delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيف يمكن تشفير النصوص بأستخدام win API
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
لماذا لا يعمل هذا الكود على دلفي 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;
use:Wcrypt2
السلام عليكم
مادا تريد ان تفعل بالضبط
تشفير أم حساب هاش
وما نوعه
التشفير أو الهاش
ان قلت تشفير فأن TEncoding غير موجود في d7
مطلوب الهاش الناتج من هذه العملية

هنا المشكلة
إقتباس : for i := 0 to dwDataLen - 1 do
Firma := Firma + Format('%.2x', [pbHash[i]]);
d7 لايعتبر pbHash كا array
إقتباس :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
المكتبة موجودة ضمن المثال
المشكلة هنا
إقتباس :pbHash: PByte;
في DXE يقوم بوضائف كثيرة (كا array) لكن في D7 لا

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

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