Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: Piotr DejaVu Szawdyński
Biblioteki C/C++

CryptProtectData

[funkcja] Szyfruje przekazane dane dając jednocześnie możliwość ich odszyfrowania tylko i wyłącznie użytkownikowi, który je zaszyfrował.

Składnia

C/C++
#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

ArgumentOpis
DATA_BLOB * pDataInWskaźnik na strukturę DATA_BLOB, która zawiera dane jakie mają zostać zaszyfrowane.
LPCWSTR szDataDescrŁańcuch znaków zawierający możliwy do odczytu opis szyfrowanych danych. Argument ten jest opcjonalny i może być ustawiony na wartość NULL.

Uwaga!
Wartość tego pola jest wymagana w systemie Windows 2000 i nie może być ustawiona na NULL.
DATA_BLOB * pOptionalEntropyOpcjonalny wskaźnik na strukturę DATA_BLOB, który zawiera hasło bądź inny dodatkowy klucz wykorzystywany do szyfrowania danych. Jeżeli struktura DATA_BLOB została użyta podczas szyfrowania musi również zostać użyta podczas deszyfrowania danych. Wartość tego argumentu może wynosić NULL w przypadku gdy nie ma potrzeby wykorzystywania dodatkowego szyfrowania.
PVOID pvReservedArgument zarezerwowany. Wartość tego argumentu musi być ustawiona na NULL.
CRYPTPROTECT_PROMPTSTRUCT * pPromptStructOpcjonalny wskaźnik na strukturę CRYPTPROTECT_PROMPTSTRUCT, która zawiera informację kiedy powiadomienie ma być wyświetlone oraz jaka powinna być treść powiadomienia. Argument ten jest opcjonalny i może być ustawiony na wartość NULL.
DWORD dwFlagsFlagi modyfikujące zachowanie funkcji szyfrującej. Opis flag znajduje się w dalszej części niniejszego dokumentu. W przypadku gdy wartość tego argumentu wyniesie 0 to funkcja zastosuje domyślne ustawienia szyfrowania.
DATA_BLOB * pDataOutWskaźnik na strukturę DATA_BLOB do której mają zostać zapisane dane w postaci zaszyfrowanej.

Po zakończeniu pracy z zaszyfrowanymi danymi pamiętaj aby zwolnić pamięć na którą wskazuje pole pbData struktury DATA_BLOB. Pamięć należy zwolnić przy pomocy funkcji LocalFree.

Flagi argumentu dwFlags

Wartość argumentu dwFlags może przyjmować jedną z poniższych flag:
Wartość (flaga)Znaczenie
CRYPTPROTECT_LOCAL_MACHINEJeżeli ta flaga jest ustawiona to dane zostaną zaszyfrowane mechanizmem umożliwiającym odszyfrowanie danych z dowolnego konta użytkownika ale tylko i wyłącznie na komputerze na którym wywołano funkcję szyfrującą.
CRYPTPROTECT_UI_FORBIDDENFlagę tą wykorzystuje się w sytuacji gdy chce się zabronić wyświetlania powiadomień, które definuje argument pPromptStruct. W przypadku gdy niniejsza flaga jest ustawiona to funkcja zabroni wyświetlić powiadomienie, a wywołanie funkcji zakończy się niepowodzeniem. Funkcja » WinAPIGetLastError zwróci kod błędu ERROR_PASSWORD_RESTRICTION w przypadku gdy zostanie zablokowane powiadomienie.
CRYPTPROTECT_AUDITFlaga ta generuje » Dokumentacjaaudyt systemowy na chronionych i niechronionych operacjach.

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ę » WinAPIGetLastError.

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:
  • Jeżeli użytkownik posiada konto mobilne (konto domenowe) to wówczas możliwe jest odszyfrowanie wiadomości z innego komputera przy użyciu tego samego konta użytkownika.
  • Jeżeli do funkcji została przekazana flaga CRYPTPROTECT_LOCAL_MACHINE to wówczas deszyfrowanie może wykonać dowolny użytkownik komputera na którym dane zostały zaszyfrowane.

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

C/C++
#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

CryptUnprotectDataDeszyfruje dane, które zostały zaszyfrowane przy pomocy funkcji » WinCryptCryptProtectData. (funkcja)
audyt systemowyMechanizm śledzenia zdarzeń systemu operacyjnego. (pojęcie)

Linki zewnętrzne