#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;
}