Składnia
#include <wincrypt.h>
BOOL WINAPI CryptProtectData(
DATA_BLOB * pDataIn,
LPCWSTR szDataDescr,
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 szyfruje przekazane dane dając jednocześnie możliwość ich odszyfrowania tylko i wyłącznie użytkownikowi, który je zaszyfrował. Proces szyfrowania i deszyfrowania danych musi odbywać się na tym samym komputerze. Wyjątki od powyższych reguł są następujące:
Opis działania
Funkcja tworzy klucz sesji w celu wykonania szyfrowania. Klucz sesji jest wykorzystywany ponownie gdy jest potrzeba odszyfrowania danych. Niniejsza funkcja dodaje również do zaszyfrowanych danych
Message Authentication Code (MAC) służący do weryfikacji poprawności zaszyfrowanych danych. Wspomniany MAC jest zapisywany w celu ochrony danych przed ich sfałszowaniem.
Dodatkowe informacje
W celu zaszyfrowania pamięci do tymczasowego użytku w tym samym procesie bądź między procesami użyj funkcji
CryptProtectMemory.
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
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.