CSP开发——基本函数详解3

来源:互联网 发布:用友软件庆阳总代理 编辑:程序博客网 时间:2024/05/21 19:33
CryptGenKey函数生成一个随机加密的会话密钥公钥/私钥对然后,可以使用该句柄可根据需要与任何CryptoAPI函数,需要一个密钥句柄。调用应用程序必须调用这个函数时指定的算法。由于该算法类型捆绑的关键,应用程序并不需要指定的算法后,当实际执行加密操作。

Syntax句法  

BOOL WINAPI CryptGenKey( BOOL WINAPI CryptGenKey(  _In_   HCRYPTPROV hProv, _In_ HCRYPTPROV hProv,  _In_   ALG_ID Algid, _In_ ALG_ID发冷,  _In_   DWORD dwFlags, _In_ DWORD dwFlags中,  _Out_  HCRYPTKEY *phKey _Out_ HCRYPTKEY * PHKEY); );

Parameters参数

hProv [in]

 一个加密服务提供程序 (CSP)的句柄。

Algid [in]

 一个ALG_ID识别算法的关键是要产生的价值。这个参数的值会有所不同,具体取决于所使用的CSP。

 对于ALG_ID值使用的Microsoft Base Cryptographic Provider的,见基地提供商算法 。

 对于ALG_ID值使用Microsoft强加密提供程序或Microsoft增强加密提供程序,请参阅增强提供算法 。

 对于一个Diffie-Hellman CSP,请使用下列值之一。

Value 意思
CALG_DH_EPHEM 

 指定一个“短命”的Diffie-Hellman密钥。

CALG_DH_SF

 指定“存储和转发”Diffie-Hellman密钥。

 除了​​对称算法生成会话密钥,此功能还可以生成公钥/私钥对 每一个的CryptoAPI的客户端通常具有两个公钥/私钥对。 要生成这些密钥对中的一个,设置发冷的参数为下列值之一。

Value 意思
AT_KEYEXCHANGE 

 密钥交换

AT_SIGNATURE

 数字签名

 注意:指定,当关键的规格AT_KEYEXCHANGE和AT_SIGNATURE是,算法,用于生成密钥的标识符取决于所使用的提供者。因此,这些关键规格,从CryptGetKeyParam (,当KP_ALGID参数指定)返回的值取决于所使用的提供。 要确定哪些算法标识符由不同的供应商的的关键指标AT_KEYEXCHANGE和AT_SIGNATURE,ALG_ID

dwFlags [in]

指定生成的密钥的类型。 可以设置一个会话密钥,RSA签名密钥和RSA密钥交换密钥生成密钥的大小。关键的大小,中位密钥模数的长度,设置此参数的高16位的。 因此,如果一个2048位的RSA签名密钥以产生,与任何其他dwFlags中预定义的值的按位OR运算相结合的值0x08000000。的高16位为0x0800或十进制的2048。 RSA1024BIT_KEY值可用于指定一个1024位的RSA密钥。

由于不断变化的出口管制限制,默认的CSP和操作系统版本的默认密钥长度可能会改变。重要的是,无论是加密和解密使用相同的CSP和密钥的长度可以明确地使用dwFlags参数设置,以确保互操作性在不同的操作系统平台。

特别是,默认的RSA加密服务提供程序是Microsoft RSA强加密提供程序。 默认的DSS签名的Diffie-Hellman加密服务提供程序是Microsoft增强DSS的Diffie-Hellman加密提供程序。这些电信运营商有一个默认的RC2和RC4对称密钥长度为128位和1024位的默认公共密钥算法的密钥长度。

 如果的高16位是零,默认密钥大小产生。 如果大于最大的或小于最小的一个键被指定时,该呼叫失败与ERROR_INVALID_PARAMETER代码。

 下表列出了最低,默认情况下,最大的签名和交换密钥长度与Windows XP开始。

Key type and provider主要类型和供应商 最小长度 默认长度 最大长度

RSA Base Provider RSA基本提供

Signature and ExchangeKeys签名和ExchangeKeys

384 384

512 512

16,384 16,384

RSA Strong and Enhanced Providers RSA强和增强供应商

Signature and Exchange Keys签名和密钥交换

384 384

1,024 1024

16,384 16,384

DSS Base Providers DSS基地供应商

Signature Keys签名密钥

512 512

1,024 1024

1,024 1024

DSS Base Providers DSS基地供应商

Exchange Keys交换密钥

 不适用

 不适用

 不适用

DSS/DH Base Providers DSS / DH基地提供的

Signature Keys签名密钥

512 512

1,024 1024

1,024 1024

DSS/DH Base Providers DSS / DH基地提供的

Exchange Keys交换密钥

512 512

512 512

1,024 1024

DSS/DH Enhanced Providers DSS / DH增强供应商的

Signature Keys签名密钥

512 512

1,024 1024

1,024 1024

DSS/DH Enhanced Providers DSS / DH增强供应商的

Exchange Keys交换密钥

512 512

1,024 1024

4,096 4096

对于会话的密钥长度,参阅CryptDeriveKey

对于生成的密钥使用Microsoft提供的详细信息,请参阅Microsoft加密服务提供商 。

 此参数的低16位,可以是零或以下值中的一个或多个的组合。

Value 意思
CRYPT_ARCHIVABLE

如果设置了这个标志,可以导出的关键,直至其手柄关闭调用CryptDestroyKey的 这使得新生成的密钥可以导出在创建时进行存档或键恢复。 句柄被关闭后,最关键的是不再出口的。

CRYPT_CREATE_IV

这个标志没有被使用。

CRYPT_CREATE_SALT

 如果设置了这个标志,那么关键是分配一个随机salt值自动进行。您可以检索该盐值,通过使用CryptGetKeyParamdwParam参数设置到KP_SALT的功能。

 如果这个标志没有被设置,则该键将被赋予盐值为零。

当按键与salt值非零的出口(通过CryptExportKey ),然后salt值也必须获得和保持的关键BLOB

CRYPT_DATA_KEY

 这个标志没有被使用。

CRYPT_EXPORTABLE

如果设置了这个标志,则该键就可以转出的CSP进入一键BLOB通过使用CryptExportKey功能。由于会话密钥可导出,通常应该设置此标志时,他们创建的。

如果这个标志没有被设置,那么关键就是无法导出。 对于一个会话密钥,这意味着,最关键的是只在当前会话中创建的应用程序将能够使用它。这意味着对于一个公钥/私钥对的私钥不能被运送或备份。

 此标志仅适用于会话密钥和私人密钥块 它并不适用于公共密钥,它总是出口的。

CRYPT_FORCE_KEY_PROTECTION_HIGH 

此标志指定强密钥保护。这个标志被设置时,系统会提示用户输入密码的关键,使用此键时,用户将被提示输入密码。

 此标志仅使用由Microsoft提供的CSP。.第三方电信运营商将自己的行为定义为强密钥保护。

 .指定强密钥保护时,在系统注册表中指定的调用这个函数的CRYPT_USER_PROTECTED标志,此标志会导致同样的结果。

 如果这个标志被指定和提供者把手在hProv参数创建通过使用CRYPT_VERIFYCONTEXTCRYPT_SILENT标志,此功能将设置的最后一个错误NTE_SILENT_CONTEXT,并返回零。

 Windows Server 2003和Windows XP中:这个标志不被支持。
CRYPT_KEK

 这个标志没有被使用。

CRYPT_INITIATOR

 这个标志没有被使用。

CRYPT_NO_SALT

 这个的标志指定无盐值被分配一个40位的对称密钥 有关详细信息,请参阅salt值的功能 。

CRYPT_ONLINE

 这个标志没有被使用。

CRYPT_PREGEN

 此标志指定一个初始的Diffie-Hellman或DSS密钥生成。这个标志是有用的,只有通过Diffie-Hellman和DSS的CSP。当使用时,将使用默认的密钥长度,除非一个密钥长度中的高16位 dwFlags参数指定。.如果涉及的密钥长度的参数上设置一个PREGEN的Diffie-Hellman或DSS键CryptSetKeyParam ,这里设置的密钥长度的密钥长度必须是兼容的。

CRYPT_RECIPIENT

 这个标志没有被使用。

CRYPT_SF

 这个标志没有被使用。

CRYPT_SGCKEY

 这个标志没有被使用。

CRYPT_USER_PROTECTED

 如果设置了这个标志,将通知用户通过一个对话框或某些行动时,另一种方法是尝试使用这把密钥。精确的行为是通过正在使用的CSP。如果提供的情况下被打开了与设置的CRYPT_SILENT标志,使用此标志会导致失败,并设置为NTE_SILENT_CONTEXT的最后一个错误。

CRYPT_VOLATILE

 这个标志没有被使用。

phKey [out]

该函数的地址,以复制的新生成的密钥的句柄。当您使用完的关键,删除密钥句柄通过调用CryptDestroyKey功能。

Return value返回值

          如果成功,或零,否则返回非零值。

原创粉丝点击