同时加密和解密

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

当使用相同的加密密钥同时加密或解密两个数据流时,必须特别小心。由于每个会话密钥都包含内部状态信息,因此同一物理会话密钥不能用于这两个操作,如果一次使用多个操作,它将被混合。这个问题的一个很简单的解决方案是制作会话密钥的副本。这样,原始密钥可以用于一个操作,另一个用于另一个操作。

通过使用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”。

...

请注意,该技术不应与流密码一起使用,因为流密码密钥不应多次使用。相反,应该使用单独的发送和接收键。