Execute News

Des nouvelles fraƮches de http://www.execute.frRSS [Home]

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.