gpt4 book ai didi

加密下一代 : Storing a key in the TPM

转载 作者:行者123 更新时间:2023-12-04 15:31:18 27 4
gpt4 key购买 nike

我目前正在开发一个使用下一代加密 (Windows Crypto API) 生成 key 的小示例程序,将其存储在我计算机上的 TPM 中,加密一些数据,然后检索它并解密数据。

我选择 RSA 加密是因为它是我的 TPM 唯一支持的算法。

我了解我可以作为提供者使用以下方式访问 TPM:

// Open handle to TPM
if (FAILED(secStatus = NCryptOpenStorageProvider(
&hProv,
MS_PLATFORM_CRYPTO_PROVIDER,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptOpenStorageProvider\n", secStatus);
goto Cleanup;
}

我可以生成 key (哪些文档说明应该将其保存在我的提供商中):

    // Create a persistent key
if (FAILED(secStatus = NCryptCreatePersistedKey(
hProv,
&hKey,
NCRYPT_RSA_ALGORITHM,
L"RSAKey0",
0,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptCreatePersistedKey\n", secStatus);
goto Cleanup;
}

(然后设置长度、完成等)

看来我的数据是通过运行加密的:

    // Encrypt Data
if (!NT_SUCCESS(status = NCryptEncrypt(
hKey, // hKey
InputData, // pbInput
InputDataSize, // cbInput
NULL, // pPaddingInfo
encryptedBuffer, // pbOutput
encryptedBufferSize, // cbOutput
&encryptedBufferSize, // pcbResult
NCRYPT_PAD_PKCS1_FLAG))) // dwFlags
{
wprintf(L"**** Failed to encrypt data. Error 0x%x returned by NCryptEncrypt\n", status);
goto Cleanup;
}

这似乎工作正常,没有错误,数据看起来是加密的。(我担心我可能会误解 RSA 加密和生成持久 key 而不是 key 对的函数用法,但因为我不想共享公钥,所以我认为这应该有效)

但是,当尝试使用以下方法检索 key 时:

    // Get key from TPM
if (FAILED(secStatus = NCryptOpenKey(
hProv,
&hKey,
L"RSAKey0",
0,
0)))
{
wprintf(L"**** Error 0x%x returned by NCryptOpenKey\n", secStatus);
goto Cleanup;
}

我收到 NTE_BAD_KEYSET 错误。这表示未找到 key 。

可能,我看到我可能缺少的唯一功能是 NCryptExportKey ,但如果我理解正确的话,将 key 导出到内存块而不是 TPM(应该保存在 CreatePersistedKey 上)。

我是否缺少确保 key 存储在我的 TPM 中的步骤?

此外,我正在使用 NCryptDeleteKey作为我的加密功能的清理,但文档指出这只是释放 key 句柄而不是实际存储的 key 。将 key 存储在 TPM 后,如何将其删除?

最佳答案

NCryptDeleteKey 会从您的 TPM 中删除 key 并清理句柄。

这是通过使用枚举和列表键进行实验发现的。

关于加密下一代 : Storing a key in the TPM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61226988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com