CryptDecrypt

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

[New - Windows NT]

[New - Windows 95, OEM Service Release 2]

CryptDecrypt功能用于解密先前通过CryptEncrypt功能加密的数据。

BOOL CRYPTFUNC CryptDecrypt(

HCRYPTKEY【的hKeyru-Latn】, 
HCRYPTHASH【马】, 
BOOL【最后】, 
DWORD【dwFlags中】, 
BYTE *【pbData】, 
DWORD *【pdwDataLen】 
); 

参数

【的hKeyru-Latn】

[in]用于解密的密钥的句柄。应用程序使用CryptGenKeyCryptImportKey函数获取该句柄。

该键指定使用的解密算法。

【马】

[in]散列对象的句柄。仅当要计算数据的散列值时才使用此参数。有关详细信息,请参阅“备注”部分。

如果没有哈希要完成,这个参数必须为零。

【最后】

[in]布尔值,指定这是否是要解密的系列中的最后一个部分。如果这是最后一个或唯一的块,这将是TRUE。如果不是,那将是FALSE。有关详细信息,请参阅“备注”部分。

【dwFlags中】

[in]标志值。此参数保留供将来使用,并且应始终为零。

【pbData】

[in/out]保存要解密的数据的缓冲区。一旦执行了解密,明文被放回到同一个缓冲区中。

此缓冲区中的加密字节数由【pdwDataLen】指定。

【pdwDataLen】

[in/out]数据长度的地址。在调用此函数之前,调用者应将此参数设置为要解密的字节数。返回时,该地址将包含生成的明文字节数。

当使用分组密码时,该数据长度必须是块大小的倍数,除非这是要解密的数据的最后部分,并且【最后】标志为TRUE。

备注

如果要同时解密和散列数据,则可以在【马】参数中传递哈希对象的句柄。哈希值将使用解密的明文进行更新。当同时解密和验证签名时,此选项很有用。

在调用CryptDecrypt之前,应用程序应该通过调用CryptCreateHash函数来获取哈希对象的句柄。一旦解密完成,就可以获得散列值(通过CryptGetHashParam),或者可以通过CryptSignHash签名(或通过CryptSignHash),或者可以使用该值来验证数字签名(通过CryptVerifySignature)。

当大量的数据需要被解密时,可以按部分进行。这通过重复调用CryptDecrypt完成。只有在CryptDecrypt的最后一次调用时,【最后】参数才应设置为TRUE,因此解密引擎可以正确完成解密过程。当【最后】为TRUE时,执行以下额外操作:

*如果密钥是块密码密钥,则数据将被填充到密码的块大小的倍数。要找到密码的块大小,请使用CryptGetKeyParam获取密钥的KP_BLOCKLEN参数。

*如果密码在链接模式下运行,则下一个CryptDecrypt操作将将密码的反馈寄存器重置为密钥的KP_IV值。

*如果密码是流密码,则下一个CryptDecrypt调用将将密码重置为初始状态。

返回值

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

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

下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。

错误描述
ERROR_INVALID_HANDLE其中一个参数指定一个无效句柄。
ERROR_INVALID_PARAMETER其中一个参数包含无效值。这通常是一个非法的指针。
NTE_BAD_ALGID【的hKeyru-Latn】会话密钥指定此CSP不支持的算法。
NTE_BAD_DATA要解密的数据无效。例如,当使用块密码并且【最后】标志为FALSE时,【pdwDataLen】指定的值必须是块大小的倍数。当发现填充无效时也可以返回此错误。
NTE_BAD_FLAGS【dwFlags中】参数为非零。
NTE_BAD_HASH【马】参数包含无效句柄。
NTE_BAD_KEY【的hKeyru-Latn】参数不包含键的有效句柄。
NTE_BAD_LEN输出缓冲区的大小太小,无法容纳生成的明文。
NTE_BAD_UID创建密钥时指定的CSP上下文无法找到。
NTE_DOUBLE_ENCRYPT应用程序尝试将相同的数据解密两次。
NTE_FAIL该函数以某种意想不到的方式失败。

请参见加密和解密数据部分中的“解密示例”。

也可以看看

CryptCreateHash, CryptEncrypt, CryptGenKey, CryptGetKeyParam, CryptGetHashParam, CryptImportKey, CryptSignHash, CryptVerifySignature