CSP开发基础--开发实例二

本文实现完整流程,对数据进行Hash,签名,验证签名。程序的流程性较强,或许这就是测试CSP应该有的步骤吧。

本程序使用VS2005编译运行通过。注意在导出头文件的时候,头文件的顺序十分重要,就如同本程序中,

<wincrypt.h>在编译的过程中大量的使用了<windows.h>,因此在引入头文件的顺序时,要首先引入<windows.h>,然后引入<wincrypt.h>.

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <windows.h>  
  4. #include <wincrypt.h>  
  5.   
  6.   
  7. void main() {  
  8.     HCRYPTPROV hProv;  
  9.     BYTE* puBuffer = (BYTE*)"data hash and sign.";  
  10.     DWORD dwBufferLen = strlen((char*)puBuffer) + 1;  
  11.     HCRYPTHASH hHash;  
  12.     HCRYPTKEY hKey;    //签名密钥句柄  
  13.     HCRYPTKEY hPubKey;  
  14.     BYTE* pbKeyBlob;  //保存密钥blob缓冲区指针  
  15.     BYTE* pbSignature;  
  16.     DWORD dwSigLen;  
  17.     DWORD dwBlobLen;  
  18.     DWORD i;  
  19.     if(CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,0))  
  20.         printf("打开句柄成功\n");  
  21.     else {  
  22.         if(!CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET))  
  23.             printf("创建失败。\n");  
  24.     }  
  25.     if(CryptGetUserKey(hProv,AT_SIGNATURE,&hKey))  
  26.         printf("获得签名密钥成功。\n");  
  27.     else {  
  28.         printf("获取失败,现在创建新的RSA密钥对。\n");  
  29.         if(!CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,0))  
  30.             printf("获取CSP句柄失败\n");  
  31.         if(!CryptGenKey(hProv,2,CRYPT_EXPORTABLE | 0X04000000,&hKey))  
  32.             printf("CryptGenKey error.\n");  
  33.     }  
  34.     if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,&dwBlobLen))  
  35.         printf("we get the length of the public key.\n");  
  36.     else  
  37.         printf("CryptExportKey erro.\n");  
  38.     if(pbKeyBlob = (BYTE*)malloc(dwBlobLen))  
  39.         printf("we get the memory.\n");  
  40.     else  
  41.         printf("malloc erro.\n");  
  42.     if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbKeyBlob,&dwBlobLen))  
  43.         printf("export the public key.\n");  
  44.     else  
  45.         printf("CryptExportKeya error.\n");  
  46.     if(CryptCreateHash(hProv,CALG_SHA1,0,0,&hHash))  
  47.         printf("CreateHash succeed.\n");  
  48.     else  
  49.         printf("CreatHash error.\n");  
  50.     if(CryptHashData(hHash,puBuffer,dwBufferLen,0))  
  51.         printf("HashData succeed.\n ");  
  52.     else  
  53.         printf("HashData error.\n");  
  54.     dwSigLen = 0;  
  55.     if(CryptSignHash(hHash,AT_SIGNATURE,NULL,0,NULL,&dwSigLen))  
  56.         printf("Get the length of signature.\n");  
  57.     else  
  58.         printf("CryptSignHash error.\n");  
  59.     if(pbSignature = (BYTE*) malloc(dwSigLen))  
  60.         printf("get the memory.\n");  
  61.     else  
  62.         printf("memory error.\n");  
  63.     if(CryptSignHash(hHash,AT_SIGNATURE,NULL,0,pbSignature,&dwSigLen))  
  64.         printf("signature succeed.\n");  
  65.     else  
  66.         printf("Signature error.\n");  
  67.     printf("Signature: \n");  
  68.     for(i=0;i<dwSigLen;i++) {  
  69.         if((i==0) && (i!=0))  
  70.             printf("\n");  
  71.         printf("%2.2x",pbSignature[i]);  
  72.     }  
  73.     printf("\n");  
  74.     printf("OK.\n");  
  75.     if(hHash)  
  76.         CryptDestroyHash(hHash);  
  77.     if(CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey))  
  78.         printf("Import the key.\n");  
  79.     else  
  80.         printf("erro");  
  81.     if(CryptCreateHash(hProv,CALG_SHA1,0,0,&hHash))  
  82.         printf("创建哈希对象成功 \n");  
  83.     else  
  84.         printf("调用CryptCreateHash失败");  
  85.     if(CryptHashData(hHash,puBuffer,dwBufferLen,0))  
  86.         printf("数据哈希完成.\n");  
  87.     else  
  88.         printf("调用CryptHashData失败");  
  89.     if(CryptVerifySignature(hHash,pbSignature,dwSigLen,hPubKey,NULL,0))  
  90.         printf("验证签名成功。\n");  
  91.     else  
  92.         printf("签名验证失败,签名无效");  
  93.     if(pbSignature)  
  94.         free(pbSignature);  
  95.     if(hHash)  
  96.         CryptDestroyHash(hHash);  
  97.     if(hProv)  
  98.         CryptReleaseContext(hProv,0);  
  99.     system("pause");  
  100. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值