⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exportkey.cpp

📁 基于CryptoAPI的导出会话密钥的程序。在windowsXP
💻 CPP
字号:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
HCRYPTPROV GetCryptProv();
void HandleError(char *s);

void main(void)
{
	//--------------------------------------------------------------------
	//  变量申明与初始化

	HCRYPTPROV hProv;       // CSP句柄
	HCRYPTKEY hXchgKey;     // 交换密钥对句柄
	HCRYPTKEY hKey;         // 会话密钥句柄
	BYTE *pbKeyBlob;        // 简单密钥块指针
	DWORD dwBlobLen;        // 密钥块长度

	//--------------------------------------------------------------------
	//获取加密服务者句柄
	hProv = GetCryptProv();

	//--------------------------------------------------------------------
   // 创建交换密钥
   if(CryptGenKey(
	   hProv,
	   AT_KEYEXCHANGE,
	   0,
	   &hXchgKey)) 
   {
	   printf("交换密钥已被创建.\n");
   }
   else
   {
	  HandleError("在试图创建交换密钥时发生错误.\n");
   }

	//--------------------------------------------------------------------
	// 创建会话密钥.

	if (CryptGenKey(     
		hProv,      
		CALG_RC4,      
		CRYPT_EXPORTABLE, 
		&hKey))
	{   
		printf("原会话密钥被创建. \n");
	}
	else
	{
	   HandleError("ERROR -- CryptGenKey.");
	}
	// 确定密钥数据块的长度.

	if(CryptExportKey(
	   hKey,            //待导出的密钥
	   hXchgKey,        //密钥数据块用此密钥加密
	   SIMPLEBLOB, 
	   0, 
	   NULL,            //密钥块,为空时用于返回密钥块的长度
	   &dwBlobLen))     //密钥块数据长度
	{
		 printf("此会话密钥数据块长度已确定. \n");
	}
	else
	{
		 HandleError("计算密钥数据块长度出错.");
	}

	if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) 
	{
		printf("已经为此数据块分配了内存空间. \n");
	}
	else
	{
		HandleError("所需内存不够. \n");
	}
	//--------------------------------------------------------------------
	// 导出密钥到简单密钥数据块

	if(CryptExportKey(
	   hKey,               //待导出的密钥
	   hXchgKey,           //密钥数据块用此密钥加密
	   SIMPLEBLOB,         //导出的密钥块类型
	   0, 
	   pbKeyBlob,          //密钥块
	   &dwBlobLen))        //密钥块数据长度
	{
		 printf("待导出密钥的内容已经被写入此数据块. \n");
	}
	else
	{
		HandleError("Error during CryptExportKey.");
	}
	//--------------------------------------------------------------------
	//   从CSP导出密钥到密钥数据块后,可以通过一些其他处理来保存密钥块, 
	//   比如把密钥数据块写到文件中.


	//--------------------------------------------------------------------
	//  释放密钥数据块内存.
	free(pbKeyBlob);

	// 销毁会话密钥.
	if(hKey)
		CryptDestroyKey(hKey);

	// 销毁交换密钥对
	if(hXchgKey)
		 CryptDestroyKey(hXchgKey);

	// 释放CSP句柄
	if(hProv) 
	   CryptReleaseContext(hProv, 0);
	
	printf("此程序运行完成无错. \n");

}// End of main                                                    

//获取加密提供者句柄
HCRYPTPROV GetCryptProv()
{
	HCRYPTPROV hCryptProv;                      // 加密服务提供者句柄
	
	//获取加密提供者句柄
	if(CryptAcquireContext(
				&hCryptProv,         // 加密服务提供者句柄
				NULL,                // 密钥容器名,这里使用登陆用户名
				MS_ENHANCED_PROV,         // 加密服务提供者     
				PROV_RSA_FULL,       // 加密服务提供者类型,可以提供加密和签名等功能
				0))                  // 标志
	{
		printf("加密服务提供者句柄获取成功!\n");
	}
	else
	{
	
  
		//重新建立一个新的密钥集
	    if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
		{
		   HandleError("重新建立一个新的密钥集出错!");
		}
 
	}
	return hCryptProv;
}

//  HandleError:错误处理函数,打印错误信息,并退出程序
void HandleError(char *s)
{
    printf("程序执行发生错误!\n");
    printf("%s\n",s);
    printf("错误代码为: %x.\n",GetLastError());
    printf("程序终止执行!\n");
    exit(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -