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

来源:互联网 发布:亲历新疆七五事件知乎 编辑:程序博客网 时间:2024/05/16 12:15
#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];//使用默认的cspif(!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;}