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

CryptUnprotectData

[funkcja] Deszyfruje dane, które zostały zaszyfrowane przy pomocy funkcji » WinCryptCryptProtectData.

Składnia

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

ArgumentOpis
DATA_BLOB * pDataInWskaźnik na strukturę DATA_BLOB, która zawiera dane jakie mają zostać odszyfrowane.
LPWSTR* szDataDescrWskaźnik do którego ma zostać zapisany adres na łańcuch znaków, który będzie zawierał opis dołączony do zaszyfrowanych danych. Argument ten jest opcjonalny i może być ustawiony na wartość NULL. W przypadku gdy zwrócony adres ppszDataDescr jest różny od NULL pamiętaj aby zwolnić go przy pomocy funkcji LocalFree.
DATA_BLOB * pOptionalEntropyOpcjonalny wskaźnik na strukturę DATA_BLOB, który zawiera hasło bądź inny dodatkowy klucz konieczny do odszyfrowania 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.
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 deszyfrują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 deszyfrowania.
DATA_BLOB * pDataOutWskaźnik na strukturę DATA_BLOB do której mają zostać zapisane dane w postaci odszyfrowanej.

Po zakończeniu pracy z odszyfrowanymi 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_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_VERIFY_PROTECTIONFlaga ta sprawdza czy domyślny poziom szyfrowania danych na komputerze jest wyższy niż ten, który został zastosowany w chwili szyfrowania wiadomości. W przypadku gdy zajdzie opisany przypadek to funkcja ustawi kod błędu CRYPT_I_NEW_PROTECTION_REQUIRED, który będzie można odczytać przy pomocy funkcji » WinAPIGetLastError. W przypadku otrzymania tego kodu błędu zaleca się ponowne zaszyfrowanie wiadomości.

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 deszyfruje dane, które zostały zaszyfrowane przy pomocy funkcji » WinCryptCryptProtectData. Możliwość odszyfrowania danych zależy od zastosowanych flag podczas szyfrowania danych - szczegółowe informacje na ten temat zostały opisane w funkcji » WinCryptCryptProtectData.

Opis działania

Funkcja » WinCryptCryptProtectData 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

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

CryptProtectDataSzyfruje przekazane dane dając jednocześnie możliwość ich odszyfrowania tylko i wyłącznie użytkownikowi, który je zaszyfrował. (funkcja)
audyt systemowyMechanizm śledzenia zdarzeń systemu operacyjnego. (pojęcie)

Linki zewnętrzne