CryptAcquireContext

【勇芳软件工作室】汉化HomePreviousNext

[New - Windows NT]

[New - Windows 95, OEM Service Release 2]

CryptAcquireContext函数用于获取特定CSP中特定密钥容器的句柄。这个返回的句柄然后可以用来调用所选的CSP。

此函数执行两个操作。它首先尝试找到具有【dwProvType】【pszProvider】参数中描述的特性的CSP。如果找到CSP,则该函数尝试在CSP中找到与【pszContainer】参数指定的名称匹配的密钥容器。

此函数也可用于创建和销毁密钥容器,具体取决于【dwFlags中】参数的值。

BOOL CRYPTFUNC CryptAcquireContext(

HCRYPTPROV *【phProv】, 
LPCTSTR【pszContainer】, 
LPCTSTR【pszProvider】, 
DWORD【dwProvType】, 
DWORD【dwFlags中】 
); 

参数

【phProv】

[out]功能将手柄复制到CSP的地址。

【pszContainer】

[in]密钥容器名称。这是一个零终止的字符串,用于标识CSP的密钥容器。此名称与用于存储密钥的方法无关。一些CSP将在内部(硬件)存储他们的密钥容器,有些CSP将使用系统注册表,其他CSP将使用文件系统。

如果此参数为NULL,则将使用默认密钥容器名称。例如,如果正在使用Microsoft RSA Base Provider,则将使用当前用户的登录名作为密钥容器的名称。其他CSP还可以具有可以以这种方式获取的默认密钥容器。

通过从CryptGetProvParam函数读取PP_CONTAINER参数,应用程序可以在以后获取获取的密钥容器的名称。

【pszProvider】

[in]提供者名称。这是一个零终止的字符串,用于指定要使用的CSP。

如果此参数为NULL,则使用用户默认提供程序。这个情况在与加密服务提供商(CSP)的接口一节中有详细的讨论。

通过从CryptGetProvParam功能中读取PP_NAME参数,应用程序可以在以后获取获取的CSP的名称。

【dwProvType】

[in]要获取的提供者的类型。以下提供者类型是预定义的。这些在与加密服务提供商(CSP)的接口部分进行了详细的讨论。

*PROV_RSA_FULL

*PROV_RSA_SIG

*PROV_DSS

*PROV_FORTEZZA

*PROV_MS_MAIL

【dwFlags中】

[in]标志值。此参数通常设置为零,但某些应用程序将设置以下标志中的一个(只有一个):

CRYPT_VERIFYCONTEXT

如果设置了该标志,那么应用程序将无法访问密钥容器的私钥。实际上,如果【pszContainer】为NULL并且没有默认密钥容器,则应用程序根本无权访问密钥容器。

此选项旨在由其唯一加密需要验证数字签名的应用程序使用。在这种情况下通常需要的唯一操作是公钥导入,散列和签名验证。

CryptAcquireContext被调用时,许多CSP将在授予访问密钥容器中的私钥之前要求拥有用户的输入。例如,私钥可以被加密,在使用私钥之前需要用户的密码。但是,如果指定了CRYPT_VERIFYCONTEXT标志,则不需要访问私钥,并且可以绕过用户界面。

CRYPT_NEWKEYSET

如果设置了此标志,则将创建一个新的密钥容器,其名称由【pszContainer】指定。如果【pszContainer】为NULL,则将创建具有默认名称的密钥容器。

注意当创建密钥容器时,大多数CSP将【不】自动创建任何公钥/私钥对。这些键必须与CryptGenKey功能单独创建。

重要此标志只能由管理应用程序设置。普通应用程序不应该创建密钥容器。

CRYPT_DELETEKEYSET

如果设置了此标志,则删除由【pszContainer】指定的密钥容器。如果【pszContainer】为NULL,那么具有默认名称的密钥容器将被删除。密钥容器中的所有密钥对也被销毁。

当设置了CRYPT_DELETEKEYSET标志时,【phProv】中返回的值未定义,因此不需要调用CryptReleaseContext函数。

重要此标志只能由管理应用程序设置。普通应用程序不应该破坏密钥容器。

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。

下表列出了GetLastError功能最常返回的错误代码。

错误描述
ERROR_INVALID_PARAMETER其中一个参数包含无效值。这通常是一个非法的指针。
ERROR_NOT_ENOUGH_MEMORY操作过程中操作系统内存不足。
NTE_BAD_FLAGS【dwFlags中】参数具有非法值。
NTE_BAD_KEYSET密钥容器的注册表项无法打开,可能不存在。
NTE_BAD_KEYSET_PARAM【pszContainer】【pszProvider】参数设置为非法值。
NTE_BAD_PROV_TYPE【dwProvType】参数的值超出范围。所有提供者类型必须为1到999(含)。
NTE_BAD_SIGNATURE提供者DLL签名未正确验证。DLL或数字签名已被篡改。
NTE_EXISTS【dwFlags中】参数是CRYPT_NEWKEYSET,但密钥容器已经存在。
NTE_KEYSET_ENTRY_BAD找到【pszContainer】密钥容器的注册表项(在HKEY_CURRENT_USER窗口中),但已损坏。有关CryptoAPI注册表使用情况的详细信息,请参阅系统管理部分。
NTE_KEYSET_NOT_DEF对于【pszContainer】指定的密钥容器,HKEY_CURRENT_USER窗口中不存在注册表项。
NTE_NO_MEMORYCSP在运行过程中耗尽了内存。
NTE_PROV_DLL_NOT_FOUND提供程序DLL文件不存在或不在当前路径上。
NTE_PROV_TYPE_ENTRY_BAD【dwProvType】指定的提供者类型的注册表项已损坏。该错误可能与用户默认的CSP列表或机器默认的CSP列表有关。有关CryptoAPI注册表使用情况的详细信息,请参阅系统管理部分。
NTE_PROV_TYPE_NO_MATCH【dwProvType】指定的提供者类型与注册表中找到的提供者类型不匹配。请注意,此错误只能在【pszProvider】指定实际的CSP名称时发生。
NTE_PROV_TYPE_NOT_DEF【dwProvType】指定的提供者类型不存在注册表项。
NTE_PROVIDER_DLL_FAIL提供程序DLL文件无法加载,可能不存在。如果存在,则该文件不是有效的DLL。
NTE_SIGNATURE_FILE_BAD在验证其签名之前,加载DLL文件映像时出错。

#include < wincrypt.h >

HCRYPTPROV hProv = 0;

BYTE pbData[1000];

DWORD dwDataLen;

//获取默认PROV_RSA_FULL提供程序的句柄。

if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){

printf("Error %x during CryptAcquireContext!\n", GetLastError());

return;

}

//读取默认CSP的名称。

dwDataLen = 1000;

if(!CryptGetProvParam(hProv,PP_NAME,pbData,& dwDataLen,0)){

printf("Error %x reading CSP name!\n", GetLastError());

return;

}

printf("Provider name:%s\n", pbData);

//读取默认密钥容器的名称。

dwDataLen = 1000;

if(!CryptGetProvParam(hProv,PP_CONTAINER,pbData,& dwDataLen,0)){

printf("Error %x reading key container name!\n", GetLastError());

return;

}

printf("Key Container name:%s\n", pbData);

//执行加密操作。

...

//发布提供者句柄。

if(!CryptReleaseContext(hProv,0)){

printf("Error %x during CryptReleaseContext!\n", GetLastError());

return;

}

// ****************************************************************

//获取Microsoft RSA基础提供程序的处理

//“Foo”键容器。

如果(!CryptAcquireContext(& hProv,TEXT(“Foo”),MS_DEF_PROV,

PROV_RSA_FULL, 0)) {

printf("Error %x during CryptAcquireContext!\n", GetLastError());

return;

}

//执行加密操作。

...

//发布提供者句柄。

if(!CryptReleaseContext(hProv,0)){

printf("Error %x during CryptReleaseContext!\n", GetLastError());

return;

}

// ****************************************************************

//获取默认提供程序的句柄。创建一个新的密钥容器

//命名为“Bar”。请注意,这个密钥容器将为空,直到键

//用CryptGenKey函数明确创建。

lstrcpy(szProv, );

lstrcpy(szContainer, );

if(!CryptAcquireContext(& hProv,TEXT(“Bar”),NULL,PROV_RSA_FULL,

CRYPT_NEWKEYSET)) {

printf("Error %x during CryptAcquireContext!\n", GetLastError());

return;

}

//执行加密操作。

...

//发布提供者句柄。

if(!CryptReleaseContext(hProv,0)){

printf("Error %x during CryptReleaseContext!\n", GetLastError());

return;

}

也可以看看

CryptGenKey, CryptGetProvParam, CryptReleaseContext