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.