若何用加密API得到纯文本的会话密钥[VC/C++编程]
本文“若何用加密API得到纯文本的会话密钥[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
运行环境: VC6 SP5, 2000 SP1,NT4 SP3.
在普通的编程中得到会话密钥匙非常重要的. 但是,微软的加密操作API(无论是底子的还是加强的)都不能供应这项功效. CryptExportKey() 和 CryptImportKey() 各自要求一个有效的密钥句柄来对会话密钥举行加密和解密. MSDN 展示了一种利用私钥的办法. 但是微软的这个在MSDN中例子相当的长. 下面的这个办法不但更快并且更有效.
在运行这个例子前,需求在Project -> Settings (Visual Studio 6.0 ) 中对以下参数举行设置:
1.增添C++预处理定义:_WIN32_WINNT=0x0500, _CRYPT32_(WIN2K)大概 _WIN32_WINNT=0x0400, _CRYPT32_(NT4)
2. 加入库衔接:crypt32.lib
例子代码以下:
#include
#include
#include
#define KEY_PAIR_SIZE dwSize - 12
#define SESSION_KEY_SIZE dwKeyMaterial
void main()
{
HCRYPTPROV hProv = 0;
HCRYPTKEY hExchangeKeyPair = 0;
HCRYPTKEY hSessionKey = 0;
BYTE *pbKeyMaterial = NULL;
DWORD dwKeyMaterial ;
BYTE *pbExportedKeyBlob = NULL;
BYTE *pbEncryptedKey = NULL;
DWORD dwSize;
unsigned int c;
__try
{
if (!CryptAcquireContext( &hProv,
"Container Name",
MS_ENHANCED_PROV ,
PROV_RSA_FULL,
CRYPT_MACHINE_KEYSET ))
{
__leave;
}
//---------------------------------------------------
//成立一个会话密钥. 在这个例子中我们将利用一个168位的3DES key.
if (!CryptGenKey( hProv, CALG_3DES,
CRYPT_EXPORTABLE, &hSessionKey ))
{
__leave;
}
//---------------------------------------------------
//得到交换密钥对的句柄
if (!CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hExchangeKeyPair))
{
__leave;
}
//--------------------------------------------------------
//用密钥对中公钥部份对会话密钥举行加密
//第一次先得到已加密的会话密钥的必要字节大小
//然后将其输出.
if (!CryptExportKey( hSessionKey,
hExchangeKeyPair,
SIMPLEBLOB,
0,
NULL,
&dwSize))
{
__leave;
}
pbExportedKeyBlob = new BYTE[dwSize];
if (!CryptExportKey( hSessionKey,
hExchangeKeyPair,
SIMPLEBLOB,
0,
pbExportedKeyBlob,
&dwSize))
{
__leave;
}
//--------------------------------------------------------
//我们删除第一个12字节大小的Blob 信息
pbEncryptedKey = new BYTE [KEY_PAIR_SIZE];
for ( c = 0 ; c < KEY_PAIR_SIZE ; c++ )
{
pbEncryptedKey[c] = pbExportedKeyBlob[c+12];
}
//--------------------------------------------------------
//此时我们用密钥对中的私钥部份便可以得到会话密钥的值.
if (!CryptDecrypt( hExchangeKeyPair, 0,
TRUE, 0,
pbEncryptedKey, &dwKeyMaterial))
{
__leave;
}
//-------------------------------------------------------
// pbKeyMaterial中存放着密钥的值
pbKeyMaterial = new BYTE[ SESSION_KEY_SIZE ];
for ( c = 0; c < SESSION_KEY_SIZE ; c++ )
{
pbKeyMaterial[c] = pbEncryptedKey[c];
}
}
__finally
{
if (pbKeyMaterial ) LocalFree(pbKeyMaterial );
if (hSessionKey) CryptDestroyKey(hSessionKey);
if (hExchangeKeyPair) CryptDestroyKey(hExchangeKeyPair);
if (hProv)
{
CryptReleaseContext(hProv, 0);
}
}
} // 完毕
以上是“若何用加密API得到纯文本的会话密钥[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |