CryptUnprotectData 函数解密并对DATA_BLOB结构中的数据进行完整性检查。 通常,唯一可以解密数据的用户是与加密数据的用户具有相同登录 凭据 的用户。 此外,加密和解密必须在同一台计算机上完成。 有关异常的信息,请参阅 CryptProtectData 的“备注”部分。
Syntax
DPAPI_IMP BOOL CryptUnprotectData(
[in] DATA_BLOB *pDataIn,
[out, optional] LPWSTR *ppszDataDescr,
[in, optional] DATA_BLOB *pOptionalEntropy,
PVOID pvReserved,
[in, optional] CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
[in] DWORD dwFlags,
[out] DATA_BLOB *pDataOut
);
参数
[in] pDataIn
指向保存加密数据的 DATA_BLOB 结构的指针。 DATA_BLOB结构的 cbData 成员包含要加密的文本的 pbData 成员字节字符串的长度。
[out, optional] ppszDataDescr
指向加密数据中包含的加密数据的字符串可读说明的指针。 此参数可以设置为 NULL。 使用 ppszDataDescr 完成后,通过调用 LocalFree 函数来释放它。
[in, optional] pOptionalEntropy
指向 DATA_BLOB 结构的指针,该结构包含加密数据时使用的密码或其他附加信息量。 此参数可设置为 NULL;但是,如果在加密阶段使用了可选的 DATA_BLOB结构, 则必须将同 一DATA_BLOB 结构用于解密阶段。 有关保护密码的信息,请参阅 “处理密码”。
pvReserved
此参数保留供将来使用,必须设置为 NULL。
[in, optional] pPromptStruct
指向 CRYPTPROTECT_PROMPTSTRUCT 结构的指针,该结构提供有关要显示提示的位置和时间以及这些提示的内容。 此参数可以设置为 NULL。
[in] dwFlags
一个指定此函数的选项的 DWORD 值。 此参数可以是零,在这种情况下,没有设置任何选项,或以下标志。
| 价值 | Meaning |
|---|---|
|
此标志用于用户界面(UI)不是选项的远程情况。 设置此标志并且为保护或取消保护作指定 UI 时,作将失败, GetLastError 返回ERROR_PASSWORD_RESTRICTION代码。 |
|
此标志验证受保护 BLOB 的保护。 如果为主机配置的默认保护级别高于 BLOB 的当前保护级别,该函数将返回 CRYPT_I_NEW_PROTECTION_REQUIRED ,以建议调用方再次保护 BLOB 中包含的纯文本。 |
[out] pDataOut
指向函数存储解密数据的 DATA_BLOB 结构的指针。 使用完DATA_BLOB结构后,通过调用 LocalFree 函数释放其 pbData 成员。
返回值
如果函数成功,该函数将返回 TRUE。
如果函数失败,则返回 FALSE。
注解
加密数据时 ,CryptProtectData 函数将创建会话密钥。 该密钥再次派生,用于解密数据 BLOB。
添加到加密数据 的消息身份验证代码 (MAC) 哈希 用于检测加密数据是否以任何方式更改。 但是,检测到篡改时返回的特定错误代码可能因损坏的性质而异。 该函数可能会返回ERROR_INVALID_DATA、ERROR_INVALID_PARAMETER,在某些情况下,可能会成功输出损坏。 应用程序不应依赖特定的错误代码来检测数据篡改。 对于可靠的篡改检测,请考虑在应用程序级别实现其他完整性检查。
使用完DATA_BLOB结构后,通过调用 LocalFree 函数释放其 pbData 成员。 任何非 NULL的 ppszDataDescr 也必须使用 LocalFree 释放。
使用完敏感信息后,通过调用 SecureZeroMemory 函数将其从内存中清除。
例子
以下示例演示如何解密 DATA_BLOB 结构中的加密数据。 此函数通过使用用户登录凭据创建的会话密钥执行解密。 有关使用此函数的另一个示例,请参阅 示例 C 程序:使用 CryptProtectData。
// Decrypt data from DATA_BLOB DataOut to DATA_BLOB DataVerify.
//--------------------------------------------------------------------
// Declare and initialize variables.
DATA_BLOB DataOut;
DATA_BLOB DataVerify;
LPWSTR pDescrOut = NULL;
//--------------------------------------------------------------------
// The buffer DataOut would be created using the CryptProtectData
// function. If may have been read in from a file.
//--------------------------------------------------------------------
// Begin unprotect phase.
if (CryptUnprotectData(
&DataOut,
&pDescrOut,
NULL, // Optional entropy
NULL, // Reserved
NULL, // Here, the optional
// prompt structure is not
// used.
0,
&DataVerify))
{
printf("The decrypted data is: %s\n", DataVerify.pbData);
printf("The description of the data was: %s\n",pDescrOut);
LocalFree(DataVerify.pbData);
LocalFree(pDescrOut);
}
else
{
printf("Decryption error!");
}
要求
| Requirement | 价值 |
|---|---|
| 最低支持的客户端 | Windows XP [桌面应用 |UWP 应用] |
| 支持的最低服务器 | Windows Server 2003 [桌面应用 |UWP 应用] |
| 目标平台 | Windows操作系统 |
| Header | dpapi.h |
| Library | Crypt32.lib |
| DLL | Crypt32.dll |