Поделиться через


Функция CryptProtectData (dpapi.h)

Функция CryptProtectData выполняет шифрование данных в DATA_BLOB структуре . Как правило, только пользователь с теми же учетными данными входа, что и пользователь, который зашифровал данные, может расшифровать данные. Кроме того, шифрование и расшифровка обычно должны выполняться на одном компьютере. Сведения об исключениях см. в разделе "Примечания".

Синтаксис

DPAPI_IMP BOOL CryptProtectData(
  [in]           DATA_BLOB                 *pDataIn,
  [in, optional] LPCWSTR                   szDataDescr,
  [in, optional] DATA_BLOB                 *pOptionalEntropy,
  [in]           PVOID                     pvReserved,
  [in, optional] CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  [in]           DWORD                     dwFlags,
  [out]          DATA_BLOB                 *pDataOut
);

Параметры

[in] pDataIn

Указатель на структуру DATA_BLOB , содержащую зашифрованный текст .

[in, optional] szDataDescr

Строка с читаемым описанием данных, которые необходимо зашифровать. Эта строка описания включается в зашифрованные данные. Этот параметр является необязательным и может иметь значение NULL.

[in, optional] pOptionalEntropy

Указатель на структуру DATA_BLOB , содержащую пароль или другую дополнительную энтропию, используемую для шифрования данных. Структура DATA_BLOB , используемая на этапе шифрования, также должна использоваться на этапе расшифровки. Этот параметр может иметь значение NULL без дополнительной энтропии. Сведения о защите паролей см. в разделе "Обработка паролей".

[in] pvReserved

Зарезервировано для дальнейшего использования и должно иметь значение NULL.

[in, optional] pPromptStruct

Указатель на структуру CRYPTPROTECT_PROMPTSTRUCT , которая содержит сведения о том, где и когда должны отображаться запросы, а также содержимое этих запросов. Этот параметр может иметь значение NULL как на этапах шифрования, так и для расшифровки.

[in] dwFlags

Этот параметр может быть одним из следующих флагов. Если флаги не требуются, этот параметр можно задать в значение 0.

Ценность Meaning
CRYPTPROTECT_LOCAL_MACHINE Если этот флаг задан, он связывает данные, зашифрованные с текущим компьютером, а не с отдельным пользователем. Любой пользователь на компьютере, на котором вызывается CryptProtectData, может использовать CryptUnprotectData для расшифровки данных.
CRYPTPROTECT_UI_FORBIDDEN Этот флаг используется для удаленных ситуаций, когда представление пользовательского интерфейса не является параметром. Если этот флаг задан, а пользовательский интерфейс указан для операции защиты или отмены защиты, операция завершается ошибкой, и GetLastError возвращает код ERROR_PASSWORD_RESTRICTION .
CRYPTPROTECT_AUDIT Этот флаг создает аудит для операций защиты и отмены защиты. Записи журнала аудита записываются только в том случае, если szDataDescr не имеет значения NULL и не пуст.

[out] pDataOut

Указатель на структуру DATA_BLOB , которая получает зашифрованные данные. Завершив использование структуры DATA_BLOB , освободив его член pbData , вызвав функцию LocalFree .

Возвращаемое значение

Если функция выполнена успешно, функция возвращает ЗНАЧЕНИЕ TRUE.

Если функция завершается ошибкой, возвращает значение FALSE. Для получения расширенных сведений об ошибке вызовите GetLastError.

Замечания

Как правило, только пользователь с учетными данными входа, которые соответствуют данным, которые шифруют данные, могут расшифровать данные. Кроме того, расшифровка обычно может выполняться только на компьютере, где были зашифрованы данные. Однако пользователь с перемещаемым профилем может расшифровать данные с другого компьютера в сети.

Если флаг CRYPTPROTECT_LOCAL_MACHINE задан при шифровании данных, любой пользователь на компьютере, на котором было выполнено шифрование, может расшифровать данные.

Функция создает ключ сеанса для выполнения шифрования. Ключ сеанса создается снова при расшифровке данных.

Функция также добавляет код проверки подлинности сообщений (MAC) (проверка целостности ключа) в зашифрованные данные для защиты от изменения данных.

Чтобы зашифровать память для временного использования в одном или нескольких процессах, вызовите функцию CryptProtectMemory .

Примеры

В следующем примере показано шифрование данных в DATA_BLOB структуре . Функция CryptProtectData выполняет шифрование с помощью ключа сеанса, созданного функцией с помощью учетных данных входа пользователя. Другой пример, использующий эту функцию, см. в примере программы C: использование CryptProtectData.

// Encrypt data from DATA_BLOB DataIn to DATA_BLOB DataOut.

//--------------------------------------------------------------------
// Declare and initialize variables.

DATA_BLOB DataIn;
DATA_BLOB DataOut;
BYTE *pbDataInput =(BYTE *)"Hello world of data protection.";
DWORD cbDataInput = strlen((char *)pbDataInput)+1;

//--------------------------------------------------------------------
// Initialize the DataIn structure.

DataIn.pbData = pbDataInput;    
DataIn.cbData = cbDataInput;

//--------------------------------------------------------------------
//  Begin protect phase. Note that the encryption key is created
//  by the function and is not passed.

if(CryptProtectData(
     &DataIn,
     L"This is the description string.", // A description string
                                         // to be included with the
                                         // encrypted data. 
     NULL,                               // Optional entropy not used.
     NULL,                               // Reserved.
     NULL,                               // Pass NULL for the 
                                         // prompt structure.
     0,
     &DataOut))
{
     printf("The encryption phase worked.\n");
     LocalFree(DataOut.pbData);
}
else
{
    printf("Encryption error using CryptProtectData.\n");
    exit(1); 
}

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows XP [классические приложения | Приложения UWP]
минимальный поддерживаемый сервер Windows Server 2003 [классические приложения | Приложения UWP]
целевая платформа Виндоус
Header dpapi.h
Library Crypt32.lib
DLL Crypt32.dll

См. также