2014-02-27 24 views
0

在MicrosoftÇsample code为RC4加密使用的CryptoAPI文件,则所述功能CryptGenKeyCryptDeriveKey和传递一个未记录的标志Microsoft CryptoAPI文件加密示例中的这个未公开的标志是什么?

#define KEYLENGTH  0x00800000 
... 
if (CryptGenKey(
     hCryptProv, 
     ENCRYPT_ALGORITHM, 
     KEYLENGTH | CRYPT_EXPORTABLE, 
     &hKey)) 
...  

没有与在CryptoAPI的头文件wincrypt.h定义该值没有标记。离开它似乎没有任何伤害。实际上,当我将算法从RC4更改为AES时,使用此标志会产生ERROR_INVALID_PARAMETER

这是什么?

回答

1

这不是无证,它不是一个标志。从您CryptGenKey链接的页面(重点煤矿):

指定生成的密钥类型。会话密钥,RSA签名密钥和RSA密钥交换密钥的大小可以在密钥生成时设置。 密钥大小(以密钥为单位)表示密钥模数的长度,用此参数的高16位进行设置。因此,如果要生成2,048位RSA签名密钥,则值0x08000000与任何其他dwFlags预定义值一起按位或操作组合。 0x08000000的高16位是0x0800或十进制2,048。该RSA1024BIT_KEY值可以用来指定一个1024位RSA密钥

#define提供用于表示高16位密钥模数以字节为单位的长度的关键尺寸,酷似上述状态。您包含的代码示例使用0x00800000来代替,以指示128位密钥。

引证接着解释:

的0x08000000的高16位为0x0800或十进制2048。

密钥大小(高16位)与预定义标志值之一的按位“或”组合。

+0

哦,我到目前为止没有看过!非常感谢。虽然,示例代码使用0x80(128)而不是0x800。 –

+0

是的,你是对的。我会编辑修复 - 谢谢。 :-) –