当使用相同的加密密钥同时加密或解密两个数据流时,必须特别小心。由于每个会话密钥都包含内部状态信息,因此同一物理会话密钥不能用于这两个操作,如果一次使用多个操作,它将被混合。这个问题的一个很简单的解决方案是制作会话密钥的副本。这样,原始密钥可以用于一个操作,另一个用于另一个操作。
通过使用CryptExportKey导出密钥,然后使用CryptImportKey将密钥导入,来复制会话密钥。当钥匙被导入时,CSP将给它自己的内部存储器部分的“新”键,好像它与原始钥匙无关。
以下代码片段显示如何获取会话密钥的副本。
HCRYPTPROV hProv; //处理CSP。
HCRYPTKEY hKey; //处理会话密钥。
HCRYPTKEY hCopyKey = 0;
HCRYPTKEY hPubKey = 0;
BYTE pbBlob[256];
DWORD dwBlobLen;
//获取我们自己的密钥交换公钥的句柄。
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hPubKey);
//将会话密钥导出到键blob中。
dwBlobLen = 256;
CryptExportKey(的hKey,hPubKey,SIMPLEBLOB,0,pbBlob,{989 796 005} dwBlobLen);
//将会话密钥导入CSP。这是单独存储的
//从原来的会话密钥。
CryptImportKey(hProv, pbBlob, dwBlobLen, 0, 0, &hCopyKey);
//对于一组操作使用“hKey”,另一组使用“hCopyKey”。
...
请注意,该技术不应与流密码一起使用,因为流密码密钥不应多次使用。相反,应该使用单独的发送和接收键。