Składnia
#include <wincrypt.h>
BOOL WINAPI CryptUnprotectData(
DATA_BLOB * pDataIn,
LPWSTR * ppszDataDescr,
DATA_BLOB * pOptionalEntropy,
PVOID pvReserved,
CRYPTPROTECT_PROMPTSTRUCT * pPromptStruct,
DWORD dwFlags,
DATA_BLOB * pDataOut
);
Argumenty
Flagi argumentu dwFlags
Wartość argumentu 
dwFlags może przyjmować jedną z poniższych flag:
Zwracana wartość
Zwraca wartość 
TRUE w przypadku sukcesu. W przeciwnym wypadku funkcja zwraca wartość 
FALSE.
Aby uzyskać rozszerzone informacje o błędzie wywołaj funkcję 
GetLastError.
Opis szczegółowy
Funkcja deszyfruje dane, które zostały zaszyfrowane przy pomocy funkcji 
CryptProtectData. Możliwość odszyfrowania danych zależy od zastosowanych flag podczas szyfrowania danych - szczegółowe informacje na ten temat zostały opisane w funkcji 
CryptProtectData.
Opis działania
Funkcja 
CryptProtectData tworzy klucz sesji podczas szyfrowania danych. Klucz ten jest pobierany ponownie i wykorzystywany do odszyfrowania danych binarnych.
W zaszyfrowanej wiadomości znajduje się Message Authentication Code (MAC), który jest wykorzystywany do sprawdzenia czy zaszyfrowane dane nie zostały zmodyfikowane w jakikolwiek sposób. W przypadku gdy MAC zaszyfrowanej wiadomości nie jest zgodny z MAC-em zapisanym w zaszyfrowanych danych to funkcja zwróci wartość 
FALSE oraz zostanie ustawiony kod błędu 
ERROR_INVALID_DATA. 
Dodatkowe informacje
Po zakończeniu pracy z odszyfrowanymi wrażliwymi danymi, wyczyść je z pamięci przy pomocy funkcji 
SecureZeroMemory. 
Przykład
#pragma comment(lib, "crypt32.lib")
#include <vector>
#include <string>
#include <cstdio>
#include <windows.h>
#include <wincrypt.h>
typedef std::vector < char > VDaneBinarneT;
bool zaszyfrujTekst( const char * sTekst, VDaneBinarneT & dane );
bool odszyfrujTekst( const VDaneBinarneT & dane, std::string & sWynik );
int main()
{
    VDaneBinarneT dane;
    if( zaszyfrujTekst( "Tekst", dane ) )
    {
        printf( "Teskt zostal zaszyfrowany.\n" );
    } else
         printf( "Nie udalo sie zaszyfrowac tekstu.\n" );
    
    std::string napis;
    if( odszyfrujTekst( dane, napis ) )
    {
        printf( "Teskt zostal odszyfrowany.\n" );
        printf( "Tresc tekstu: %s.\n", napis.c_str() );
    } else
         printf( "Nie udalo sie odszyfrowac tekstu.\n" );
    
    return 0;
}
bool zaszyfrujTekst( const char * sTekst, VDaneBinarneT & dane )
{
    dane.clear();
    DATA_BLOB doZaszyfrowania;
    doZaszyfrowania.pbData = const_cast < BYTE *>( reinterpret_cast < const BYTE *>( sTekst ) );
    doZaszyfrowania.cbData =::strlen( sTekst );
    DATA_BLOB wynikSzyfrowania;
    if( !::CryptProtectData( & doZaszyfrowania, L"", NULL, NULL, NULL, 0, & wynikSzyfrowania ) )
         return false;
    
    dane.resize( wynikSzyfrowania.cbData );
    ::memcpy( & dane[ 0 ], wynikSzyfrowania.pbData, wynikSzyfrowania.cbData );
    ::LocalFree( wynikSzyfrowania.pbData );
    return true;
}
bool odszyfrujTekst( const VDaneBinarneT & dane, std::string & sWynik )
{
    sWynik.clear();
    DATA_BLOB doOdszyfrowania;
    doOdszyfrowania.pbData = const_cast < BYTE *>( reinterpret_cast < const BYTE *>( & dane[ 0 ] ) );
    doOdszyfrowania.cbData = dane.size();
    DATA_BLOB wynikOdszyfrowania;
    if( !::CryptUnprotectData( & doOdszyfrowania, NULL, NULL, NULL, NULL, 0, & wynikOdszyfrowania ) )
         return false;
    
    sWynik.assign( reinterpret_cast < char *>( wynikOdszyfrowania.pbData ), wynikOdszyfrowania.cbData );
    ::LocalFree( wynikOdszyfrowania.pbData );
    return true;
}
Zagadnienia powiązane
| CryptProtectData | Szyfruje przekazane dane dając jednocześnie możliwość ich odszyfrowania tylko i wyłącznie użytkownikowi, który je zaszyfrował. (funkcja) | 
|---|
| audyt systemowy | Mechanizm śledzenia zdarzeń systemu operacyjnego. (pojęcie) | 
|---|
Linki zewnętrzne
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem 
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.