unit MSNId2_V2; interface Uses SysUtils, Windows, Classes; Type TMSN_Id2File = Class(TObject) Private _hKey : ULong; _hHash : ULong; _hProvider : ULong; Procedure ReleaseKey; Function UpdateKey(szKey : String) : Boolean; Public Constructor Create; Destructor Destroy; Override; Function Decrypt(szKey : String; AStream : TStream) : Boolean; End; implementation Uses Dialogs; Function CryptDestroyKey(hKey : ULong) : Bool; Stdcall; External 'advapi32.dll'; Function CryptDestroyHash(hHash : Ulong) : Bool; Stdcall; External 'advapi32.dll'; Function CryptReleaseContext(hProv : ULong; dwFlags : DWORD) : Bool; Stdcall; External 'advapi32.dll'; Function CryptAcquireContext(VAR phProv : ULong; pszContainer, pszProvider : PCHAR; dwProvType, dwFlags : DWORD) : Bool; Stdcall; External 'advapi32.dll' Name 'CryptAcquireContextA'; Function CryptCreateHash(hProv : ULong; algid : UInt; hKey : ULong; dwFlags : DWORD; VAR phHash : ULong) : Bool; Stdcall; External 'advapi32.dll'; Function CryptHashData(hHash : ULong; pbData : PChar; dwDataLen, dwFlags : DWORD) : Bool; Stdcall; External 'advapi32.dll'; Function CryptDeriveKey(hProv : ULong; algid : UInt; hBaseData : ULong; dwFlags : DWORD; VAR phKey : ULong) : Bool; Stdcall; External 'advapi32.dll'; Function CryptDecrypt(hKey, hHash : ULong; Final : Boolean; dwFlags : ULong; VAR pData; Var pdwDataLen : ULong) : Bool; Stdcall; External 'advapi32.dll'; Const PROV_RSA_AES = 24; CRYPT_NEWKEYSET = 8; CRYPT_EXPORTABLE = 1; ALG_CLASS_HASH = 32768; ALG_TYPE_ANY = 0; ALG_SID_SHA1 = 4; CALG_SHA1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1; ALG_CLASS_DATA_ENCRYPT = 24576; ALG_TYPE_BLOCK = 1536; ALG_SID_AES_128 = 14; CALG_AES_128 = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_AES_128; {==============================================================================} { TMSN_Id2File :: Constructor / Destructor } {==============================================================================} Constructor TMSN_Id2File.Create; Begin Inherited Create; End; {==============================================================================} {==============================================================================} Destructor TMSN_Id2File.Destroy; Begin Inherited Destroy; End; {==============================================================================} { TMSN_Id2File :: Methodes Privees } {==============================================================================} Procedure TMSN_Id2File.ReleaseKey; Begin If Self._hKey > 0 Then Begin CryptDestroyKey(Self._hKey); Self._hKey := 0; End; If Self._hHash > 0 Then Begin CryptDestroyHash(_hHash); Self._hHash := 0; End; If Self._hProvider > 0 Then Begin CryptReleaseContext(_hProvider, 0); Self._hProvider := 0; End; End; {==============================================================================} {==============================================================================} Function TMSN_Id2File.UpdateKey(szKey : String) : Boolean; Begin Result := False; If Length(szKey) <> 16 Then Exit; Self.ReleaseKey; szKey := Lowercase(szKey); //ShowMEssage(IntToStr(Self._hProvider)); //ShowMEssage(IntToStr(Self._hHash)); //ShowMEssage(IntToStr(Self._hKey)); If not CryptAcquireContext(Self._hProvider, nil, nil, PROV_RSA_AES, 0) Then If not CryptAcquireContext(_hProvider, nil, nil, PROV_RSA_AES, CRYPT_NEWKEYSET) Then Exit; If CryptCreateHash(Self._hProvider, CALG_SHA1, 0, 0, Self._hHash) Then If CryptHashData(Self._hHash, PChar(szKey), Length(szKey) * 2, 0) Then If CryptDeriveKey(Self._hProvider, CALG_AES_128, Self._hHash, CRYPT_EXPORTABLE, Self._hKey) Then Result := True; //ShowMEssage(IntToStr(Self._hProvider)); //ShowMEssage(IntToStr(Self._hHash)); //ShowMEssage(IntToStr(Self._hKey)); End; {==============================================================================} { TMSN_Id2File :: Methode Publique } {==============================================================================} Function TMSN_Id2File.Decrypt(szKey : String; AStream : TStream) : Boolean; Var Data : array of Byte; Size, Count : DWord; F : File; Err, i : Integer; Begin Result := False; If not Self.UpdateKey(szKey) Then Exit; If not Assigned(AStream) Then ShowMEssage('Erreur Stream'); Size := AStream.Size; SetLEngth(data, Size); AStream.Position := 0; For i := 0 to Size-1 do AStream.Read(data[i], 1); ShowMessage('ok'); CryptDecrypt(Self._hKey, 0, True, 0, data, Size); Err := GetLastError; ShowMEssage(IntToStr(err)); Case Err of ERROR_INVALID_HANDLE : ShowMessage('ERROR_INVALID_HANDLE'); ERROR_INVALID_PARAMETER : ShowMessage('ERROR_INVALID_PARAMETER'); NTE_BAD_ALGID : ShowMessage('NTE_BAD_ALGID'); NTE_BAD_DATA : ShowMessage('NTE_BAD_DATA'); NTE_BAD_FLAGS : ShowMessage('NTE_BAD_FLAGS'); NTE_BAD_HASH : ShowMessage('NTE_BAD_HASH'); NTE_BAD_KEY : ShowMessage('NTE_BAD_KEY'); NTE_BAD_LEN : ShowMessage('NTE_BAD_LEN'); NTE_BAD_UID : ShowMessage('NTE_BAD_UID'); NTE_DOUBLE_ENCRYPT : ShowMessage('NTE_DOUBLE_ENCRYPT'); NTE_FAIL : ShowMessage('NTE_FAIL'); end; //If not CryptDecrypt(Self._hKey, 0, True, 0, data, Size) Then // Begin ShowMEssage('Erreur Decryptage'); Exit; End; //AStream.Position := 0; //AStream.Size := 0; //AStream.Write(data^, size); //ShowMEssage('Decryptage terminé'); End; end.