[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]用于解密的密钥的句柄。应用程序使用CryptGenKey或CryptImportKey函数获取该句柄。
该键指定使用的解密算法。
【马】
[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