Por lo que si queremos guardar una contraseña solo tenemos que utilizar esta función, y aunque alguien acceda al fichero donde la guardamos no podrá descifrarlo a menos que se loguee en el sistema con el mismo nombre de usuario que la creo.
Esto también podemos utilizarlo para generar un numero de serie único que identifique un ordenador cifrando un dato conocido. Luego solo tenemos que descifrarlo y comprobar que el resultado es igual al dato que habíamos cifrado para saber si se trata del mismo ordenador.
El código (por supuesto es una aplicación de consola

program Test; {$APPTYPE CONSOLE} uses Windows, SysUtils; type TDATA_BLOB = record cbData: DWORD; pbData: PByte; end; PDATA_BLOB = ^TDATA_BLOB; TCRYPTPROTECT_PROMPTSTRUCT = record cbSize: DWORD; dwPromptFlags: DWORD; hwndApp: HWND; szPrompt: PWChar; end; PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT; function CryptProtectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar; pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer; pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB ): BOOL; stdcall; external 'Crypt32.dll'; function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar; pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer; pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB ): BOOL; stdcall; external 'Crypt32.dll'; procedure PrintData(Data: TDATA_BLOB); var i: Integer; P: PByte; begin P:= Data.pbData; for i:= 1 to Data.cbData do begin Write(IntToHex(P^,2) + #32); if i mod 16 = 0 then Writeln; inc(P); end; end; const // Si usamos este flag el dato lo puede descifrar cualquier usuario del mismo ordenador CRYPTPROTECT_LOCAL_MACHINE = 4; var Str: String; Src, Dst: TDATA_BLOB; begin Str:= 'Texto sin cifrar'; Writeln('Texto sin cifrar: ' + Str); Src.cbData:= Length(Str) + 1; Src.pbData:= PByte(PChar(Str)); FillChar(Dst,Sizeof(Dst),#0); if CryptProtectData(@Src,nil,nil,nil,nil,CRYPTPROTECT_LOCAL_MACHINE,@Dst) then try Writeln('Texto cifrado: '); PrintData(Dst); Writeln; FillChar(Src,Sizeof(Src),#0); if CryptUnProtectData(@Dst,nil,nil,nil,nil,CRYPTPROTECT_LOCAL_MACHINE,@Src) then try Write('Texto descifrado: '); Writeln(String(PChar(Src.pbData))); finally LocalFree(Cardinal(Src.pbData)); end else Writeln(SysErrorMessage(GetLastError)); finally LocalFree(Cardinal(Dst.pbData)); end else Writeln(SysErrorMessage(GetLastError)); Writeln; Readln; end.