NCryptImportKey 函数 (ncrypt.h)

NCryptImportKey 函数从内存 BLOB 导入加密 API:下一代(CNG)密钥。

语法

SECURITY_STATUS NCryptImportKey(
  [in]           NCRYPT_PROV_HANDLE hProvider,
  [in, optional] NCRYPT_KEY_HANDLE  hImportKey,
  [in]           LPCWSTR            pszBlobType,
  [in, optional] NCryptBufferDesc   *pParameterList,
  [out]          NCRYPT_KEY_HANDLE  *phKey,
  [in]           PBYTE              pbData,
  [in]           DWORD              cbData,
  [in]           DWORD              dwFlags
);

参数

[in] hProvider

密钥存储提供程序的句柄。

[in, optional] hImportKey

加密导入密钥 BLOB 中的密钥数据的加密密钥的句柄。 这必须是 NCryptExportKey 函数的 hExportKey 参数中传递的同一密钥的句柄。 如果此参数为 NULL,则假定密钥 BLOB 未加密。

[in] pszBlobType

一个以 null 结尾的 Unicode 字符串,其中包含指定密钥 BLOB 格式的标识符。 这些格式特定于特定的密钥存储提供程序。 有关Microsoft提供程序支持的 BLOB 格式,请参阅 “备注”。

[in, optional] pParameterList

指向包含密钥参数信息的缓冲区数组的 NCryptBufferDesc 结构的地址。

[out] phKey

接收密钥句柄 的NCRYPT_KEY_HANDLE 变量的地址。 使用此句柄后,请将其传递给 NCryptFreeObject 函数来释放它。

[in] pbData

包含要导入的密钥 BLOB 的缓冲区的地址。 cbData 参数包含此缓冲区的大小。

[in] cbData

pbData 缓冲区的大小(以字节为单位)。

[in] dwFlags

修改函数行为的标志。 这可以是零,也可以是以下一个或多个值的组合。 有效标志集特定于每个密钥存储提供程序。

价值 含义
NCRYPT_SILENT_FLAG 请求密钥服务提供商(KSP)不显示任何用户界面。 如果提供程序必须显示要运行的 UI,调用将失败,KSP 应将 NTE_SILENT_CONTEXT 错误代码设置为最后一个错误。
NCRYPT_REQUIRE_VBS_FLAG 指示密钥必须使用基于虚拟化的安全性(VBS)进行保护。 默认情况下,这会创建存储在磁盘上的跨启动持久化密钥,该密钥在重启周期内持续存在。

如果 VBS 不可用,作将失败。 (*请参阅备注
NCRYPT_PREFER_VBS_FLAG 指示应使用基于虚拟化的安全性(VBS)保护密钥。 默认情况下,这会创建存储在磁盘上的跨启动持久化密钥,该密钥在重启周期内持续存在。

如果 VBS 不可用,则作将生成软件隔离的密钥。 (*请参阅备注
NCRYPT_USE_PER_BOOT_KEY_FLAG 可与 NCRYPT_REQUIRE_VBS_FLAGNCRYPT_PREFER_VBS_FLAG一起使用的其他标志。 指示基于虚拟化的安全性(VBS)使用存储在磁盘中的每个启动密钥来保护客户端密钥,但不能在启动周期之间重复使用。 (*请参阅备注

返回值

返回一个状态代码,指示函数的成功或失败。

可能的返回代码包括但不限于以下代码:

返回代码 DESCRIPTION
ERROR_SUCCESS 函数成功。
NTE_BAD_FLAGS dwFlags 参数包含无效的值。
NTE_EXISTS 具有指定名称的键已存在,并且未指定 NCRYPT_OVERWRITE_KEY_FLAG
NTE_INVALID_HANDLE hProvider 参数无效。
NTE_INVALID_PARAMETER 一个或多个参数无效。
NTE_NO_MEMORY 发生内存分配失败。
NTE_VBS_UNAVAILABLE VBS 不可用。
NTE_VBS_CANNOT_DECRYPT_KEY VBS 解密作失败。

注解

重要

有关 VBS 标志的信息与预发布产品有关,该产品在商业发布之前可能会进行大幅修改。 Microsoft对此处提供的信息不作任何明示或暗示的保证。

服务不得从其 StartService 函数调用此函数。 如果服务从 其 StartService 函数调用此函数,可能会发生死锁,并且服务可能会停止响应。

以下部分介绍特定于Microsoft密钥存储提供程序的行为:

  • Microsoft软件 KSP
  • Microsoft智能卡 KSP

Microsoft软件 KSP

pszBlobType 参数Microsoft软件 KSP 支持以下常量。

如果未提供密钥名称,则 Microsoft Software KSP 会将密钥视为临时密钥,并且不会永久存储密钥。 对于 NCRYPT_OPAQUETRANSPORT_BLOB 类型,密钥名称在导出时存储在 BLOB 中。 对于其他 BLOB 格式,名称可以在 pParameterList 参数中的NCRYPTBUFFER_PKCS_KEY_NAME缓冲区参数中提供。

在 Windows Server 2008 和 Windows Vista 上,只有导入为 PKCS #7 信封 BLOB(NCRYPT_PKCS7_ENVELOPE_BLOB)或 PKCS #8 私钥 BLOB(NCRYPT_PKCS8_PRIVATE_KEY_BLOB)的密钥才能使用上述方法持久保存。 若要在这些平台上持久保存通过其他 BLOB 类型导入的密钥,请使用 密钥导入和导出中记录的方法。

ML-KEM 和 ML-DSA 密钥支持以下 BLOB 类型:

BLOB 类型 DESCRIPTION
BCRYPT_MLKEM_PUBLIC_BLOB BLOB 是一个 ML-KEM BLOB,它提供每个 FIPS 203 的标准字节编码 ML-KEM 封装密钥的导入和导出。 pbInput 缓冲区必须包含包含字节编码的 KEM 封装键、BCRYPT_MLKEM_PUBLIC_MAGIC和 ML-KEM 参数集的BCRYPT_MLKEM_KEY_BLOB结构。
BCRYPT_MLKEM_PRIVATE_BLOB BLOB 是一个 ML-KEM BLOB,它提供每个 FIPS 203 的标准字节编码 ML-KEM 解封密钥的导入和导出。 pbInput 缓冲区必须包含一个BCRYPT_MLKEM_KEY_BLOB结构,该结构包含字节编码的 KEM 解封密钥、BCRYPT_MLKEM_PRIVATE_MAGIC和 ML-KEM 参数集。
BCRYPT_MLKEM_PRIVATE_SEED_BLOB BLOB 是一个 ML-KEM BLOB,它为每个 FIPS 203 提供 ML-KEM 种子的导入和导出。 pbInput 缓冲区必须包含包含 KEM 种子、BCRYPT_MLKEM_SEED_MAGIC和 ML-KEM 参数集的BCRYPT_MLKEM_KEY_BLOB结构。
BCRYPT_PQDSA_PUBLIC_BLOB BLOB 是 ML-DSA、SLH-DSA、LMS 或 XMSS BLOB,提供每个 FIPS 204 和 205 PQ 数字签名公钥的导入和导出。 pbInput 缓冲区必须包含包含密钥材料、公共 magic 和 PQ 参数集的BCRYPT_PQDSA_KEY_BLOB结构。
BCRYPT_PQDSA_PRIVATE_BLOB BLOB 是 ML-DSA、SLH-DSA、LMS 或 XMSS BLOB,它提供每个 FIPS 204 和 205 PQ 数字签名私钥的导入和导出。 pbInput 缓冲区必须包含包含密钥材料、专用 magic 和 PQ 参数集的BCRYPT_PQDSA_KEY_BLOB结构。
BCRYPT_PQDSA_PRIVATE_SEED_BLOB BLOB 是 ML-DSA、SLH-DSA、LMS 或 XMSS BLOB,提供每个 FIPS 204 和 205 PQ 数字签名专用种子的导入和导出。 pbInput 缓冲区必须包含一个BCRYPT_PQDSA_KEY_BLOB结构,该结构包含种子值、专用种子 magic 和 PQ 参数集。

此 KSP 支持以下标志。

术语 DESCRIPTION
NCRYPT_NO_KEY_VALIDATION 不要验证密钥对的公共部分。 此标志仅适用于公钥/私钥对。
NCRYPT_DO_NOT_FINALIZE_FLAG 请勿完成密钥。 在导入密钥后需要添加或修改密钥的属性时,此选项非常有用。 必须将密钥句柄传递给 NCryptFinalizeKey 函数,然后才能使用密钥。 私钥 PKCS #7 和 PKCS #8 支持此标志,但不支持公钥。
NCRYPT_MACHINE_KEY_FLAG 密钥适用于本地计算机。 如果此标志不存在,则密钥将应用于当前用户。
NCRYPT_OVERWRITE_KEY_FLAG 如果容器中已存在具有指定名称的密钥,将覆盖现有密钥。 如果未指定此标志并且已存在具有指定名称的键,则此函数将返回 NTE_EXISTS
NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG 还将密钥保存在旧存储中。 这样,密钥就可以与 CryptoAPI 一起使用。 此标志仅适用于 RSA 密钥。

Microsoft智能卡 KSP

此 KSP 支持的关键 BLOB 格式和标志集与 Microsoft 软件 KSP 支持的集相同。

在 Windows Server 2008 和 Windows Vista 上,Microsoft智能卡 KSP 将所有密钥导入Microsoft软件 KSP。 因此,无法使用此 API 将密钥保存到智能卡上,在尝试将密钥保存在 Microsoft Software KSP 中时,上述部分中的指南适用。

在 Windows Server 2008 R2 和 Windows 7 上,Microsoft智能卡密钥存储提供程序可以将私钥导入智能卡,前提是满足以下条件:

  • 卡上的密钥容器名称有效。
  • 智能卡支持导入私钥。
  • 以下两个注册表项设置为 DWORD0x1
    • HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Smart Card Crypto Provider\AllowPrivateExchangeKeyImport
    • HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Smart Card Crypto Provider\AllowPrivateSignatureKeyImport

如果密钥容器名称为 NULL,Microsoft智能卡 KSP 会将密钥视为临时密钥,并将其导入Microsoft软件 KSP。

VBS 密钥的其他硬件要求

尽管计算机上安装了适当的 OS,但必须满足以下附加硬件要求才能使用 VBS 生成和保护密钥。

  • 已启用 VBS (请参阅基于虚拟化的安全性 (VBS)
  • 已启用 TPM
    • 对于裸机环境,需要 TPM 2.0。
    • 对于 VM 环境,支持 vTPM(虚拟 TPM)。
  • BIOS 应使用 SecureBoot 配置文件升级到 UEFI

有关硬件要求的详细信息:

  • VBS 需要运行多个硬件要求,包括 Hyper-V(Windows 虚拟机监控程序)、64 位体系结构和 IOMMU 支持。 可在 此处找到 VBS 硬件要求的完整列表。
  • 可在此处找到高度安全的设备的要求。

要求

要求 价值
最低支持的客户端 Windows Vista [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2008 [桌面应用 |UWP 应用]
目标平台 Windows操作系统
标头 ncrypt.h
图书馆 Ncrypt.lib
DLL Ncrypt.dll

另请参阅

NCryptBuffer

NCryptCreatePersistedKey