0

在使用 CryptoAPI 对文件进行 RC4 加密的 Microsoft C示例代码中,函数CryptGenKeyCryptDeriveKey被传递了一个未记录的标志

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

CryptoAPI 头文件中没有定义该值的标志wincrypt.h。离开它似乎没有任何害处。事实上,当我将算法从 RC4 更改为 AES 时,使用此标志会导致ERROR_INVALID_PARAMETER.

它有什么用?

4

1 回答 1

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,即十进制 2,048。

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

于 2014-02-27T21:46:36.133 回答