带有初始化向量的Key的产生

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "eboy_wincrypt.h"
void HandleError(char *s);
void Test()
{
	HCRYPTPROV hProv;
	HCRYPTKEY hKey;
	BYTE pbRandomData[8];
	DWORD dwCount;
	BYTE dwMode;
	BYTE pbData[16];
	//使用默认的csp
	if(!CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0))
	{
		HandleError("调用CryptAcquireContext 出错");
	}
	//产生8字节的随机数
	if(CryptGenRandom(hProv,8,pbRandomData))
	{
		printf("产生8字节随机数成功:\n");
		for(int i=0;i<8;i++)
			printf("%2.2x ",pbRandomData[i]);
			printf("\n");
	}
	else
	{
		HandleError("产生随机数失败");
	}
	//产生一个随机的会话密钥,算法为CALG_DES,标示可导出
	if(!CryptGenKey(hProv,CALG_DES,CRYPT_EXPORTABLE,&hKey))
	{
		HandleError("调用CryptGenKey失败.");
	}
	//获得密钥KP_MODE参数
	dwCount=sizeof(DWORD);
	printf("dwCount为%d \n",dwCount);
	if(CryptGetKeyParam(hKey,KP_MODE,&dwMode,&dwCount,0))
	{
		printf("算法MODE:%d\n",dwMode);
	}
	else
	{
		HandleError("调用CryptGetKeyParam 出错.");
	}
	if(!CryptGetKeyParam(hKey,KP_IV,NULL,&dwCount,0))
	{
		HandleError("调用 CryptGetKeyParam 出错");
	}
	if(CryptGetKeyParam(hKey,KP_IV,pbData,&dwCount,0))
	{
		//打印初始化向量
		printf("默认初始化向量:");
		for(int i=0;i<dwCount;i++)
			printf("%2.2x ",pbData[i]);
		printf("\n");
	}
	else
	{
		HandleError("调用CryptGetKeyParam 出错.");
	}
	if(CryptSetKeyParam(hKey,KP_IV,pbRandomData,0))
	{
		printf("设置了新的初始化向量\n");
	}
	else
	{
		HandleError("调用 CryptSetKeyParam 出错.");
	}
	if(!CryptGetKeyParam(hKey,KP_IV,NULL,&dwCount,0))
	{
		HandleError("调用 CryptGetKeyParam 出错.");
	}
	if(CryptGetKeyParam(hKey,KP_IV,pbData,&dwCount,0))
	{
		printf("重新设置的初始化向量:");
		for(int i=0;i<dwCount;i++)
			printf("%2.2x ",pbData[i]);
	}
	if(hKey)    //不要忘了
	{
		CryptDestroyKey(hKey);
	}
	if(hProv)  ///不要忘了
	{
		CryptReleaseContext(hProv,0);
	}
	printf("\n程序结束\n");
}
void HandleError(char *s)
{
	printf("本程序在运行时有错误发生.\n");
	printf("%s\n",s);
	printf("错误码: %x\n.",GetLastError());
	printf("程序退出.\n");
	exit(1);
}
int main()
{
	Test();
	return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值