如果为特定用户加密了一条消息,则在执行加密之前,CryptGenKey功能用于创建一个随机会话密钥。这意味着在消息可以被解密之前,需要使用CryptImportKey功能将含有会话密钥的密钥包导入到CSP中。此函数将使用密钥交换私钥来解密密钥blob。这意味着密钥blob必须是最初使用匹配密钥交换公钥创建的。
如果邮件已加密,以便任何密码持有人可以访问数据,则不会使用CryptImportKey功能。而是使用CryptDeriveKey功能创建解密会话密钥。您还需要向该函数提供密码(或其他访问令牌)。
会话密钥的参数需要以与执行加密时相同的方式进行配置。可以使用CryptSetKeyParam功能指定这些参数。例如,如果在加密过程中盐值改变了一次或多次,那么在解密过程中也必须以完全相同的方式改变盐值。
消息使用CryptDecrypt函数进行解密。如果消息太大,无法舒适地放在内存中,则可以通过多次调用CryptDecrypt对其进行解密。
解密完成后,请务必使用CryptDestroyKey功能销毁会话密钥。除了破坏关键,这将释放CSP资源。