📄 exportkey.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 + -