Petite fonction de cryptage sous Windows
PubliĆ© le 06/06/2018 [Delphi]On a toujours besoin d'une petite fonction de cryptage rapide pour sauvegarder une mot de passe ou autre...voici une petite unité sous Windows qui répond à ce besoin.
unit Execute.Win.CryptString; { (c)2018 Execute SARL} interface uses Winapi.Windows, System.SysUtils; function CryptString(const Str: string): TBytes; function DecryptString(const Data: TBytes): string; implementation type DATA_BLOB = record cbData :DWORD; pbData :PAnsiChar; // PBYTE but PAnsiChar is better for debug purpose end; PDATA_BLOB = ^DATA_BLOB; function CryptProtectData( var pDataIn : DATA_BLOB; ppszDataDescr : PChar; pOptionalEntropy: PDATA_BLOB; pvReserved : Integer; pPromptStruct : Pointer; // PCRYPTPROTECT_PROMPTSTRUCT; dwFlags : DWORD; var pDataOut : DATA_BLOB ): BOOL; stdcall; external 'crypt32.dll'; function CryptUnprotectData( var pDataIn : DATA_BLOB; ppszDataDescr : PPChar; pOptionalEntropy: PDATA_BLOB; pvReserved : Integer; pPromptStruct : Pointer; // PCRYPTPROTECT_PROMPTSTRUCT; dwFlags : DWORD; var pDataOut : DATA_BLOB ): BOOL; stdcall; external 'crypt32.dll'; function CryptString(const Str: string): TBytes; var DataIn : DATA_BLOB; DataOut : DATA_BLOB; begin if Str = '' then Exit(nil); DataIn.cbData := Length(Str) * SizeOf(Char); DataIn.pbData := Pointer(Str); if CryptProtectData(DataIn, 'Execute.Win.CryptString', nil, 0, nil, 0, DataOut) = False then RaiseLastOSError; SetLength(Result, DataOut.cbData); Move(DataOut.pbData^, Result[0], DataOut.cbData); LocalFree(NativeUInt(DataOut.pbData)); end; function DecryptString(const Data: TBytes): string; var DataIn : DATA_BLOB; DataOut : DATA_BLOB; begin if Data = nil then Exit(''); DataIn.cbData := Length(Data); DataIn.pbData := Pointer(Data); if CryptUnprotectData(DataIn, nil, nil, 0, nil, 0, DataOut) = False then RaiseLastOSError; SetLength(Result, DataOut.cbData div SizeOf(Char)); Move(DataOut.pbData^, Pointer(Result)^, DataOut.cbData); LocalFree(NativeUInt(DataOut.pbData)); end; end.