winAPI做hash加密

http://blog.csdn.net/wangxijie/archive/2009/09/04/4520562.aspx

  1. #include <iostream>   
  2. #include <vector>   
  3. using   namespace  std;  
  4. #include <windows.h>   
  5. #include <wincrypt.h>   
  6. #include <stdlib.h>   
  7. #include <share.h>   
  8. #include <tchar.h>   
  9. #include <io.h>   
  10. #define BOLCKSIZE 184320   
  11. DWORD  ComputeHash(CONST  BYTE  *pbData,  DWORD  dwDataLen, ALG_ID algId,   
  12.                   BYTE *& pbOutHash,  DWORD & dwHashLen, BOOL  showDBInfo=FALSE);  
  13. int  main()  
  14. {  
  15.     vector<BYTE *> hashVec;  
  16.     FILE  *file=_tfsopen(_T( "protocol_4f_54.txt" ),_T( "rb" ),_SH_DENYNO);  
  17.     if (!file)  
  18.     {  
  19.         printf("open file fail!/n" );  
  20.         return  -1;  
  21.     }  
  22.     int  fileSize=_filelengthi64(file->_file);  
  23.     printf("file size:%d/n" ,fileSize);  
  24.     //设置缓冲区大小   
  25.     //setvbuf(file,NULL,_IOFBF,1024*8*2);   
  26.       
  27.     BYTE * pbOutHash;  
  28.     DWORD  dwHashLen;  
  29.     //char pbData[9728000]="wangxijie/0";   
  30.     char * pbData= new   char [BOLCKSIZE];  
  31.     int   dwDataLen=strlen(pbData);  
  32.     int  togo=0;  
  33.     size_t  realLen;  
  34.     while (togo<fileSize)  
  35.     {  
  36.         realLen=fread(pbData,1,BOLCKSIZE,file);  
  37.         ComputeHash((BYTE *)&pbData[0],realLen,CALG_MD5,pbOutHash,dwHashLen);  
  38.         hashVec.push_back(pbOutHash);  
  39.         for ( int  i=0;i<dwHashLen;i++)  
  40.             printf("%02x " ,pbOutHash[i]);  
  41.         printf("/n%d/n" ,realLen);  
  42.         togo+=realLen;  
  43.     }  
  44.   
  45.     BYTE * resHash= new   BYTE [hashVec.size()*16];  
  46.     for ( int  i=0;i<hashVec.size();i++)  
  47.     {  
  48.         memcpy(resHash+i*16,hashVec[i],16);  
  49.         delete [] hashVec[i];  
  50. //      for(int j=0;j<16;j++)   
  51. //          printf("%02x ",(resHash+i*16)[j]);   
  52. //      printf("/n");   
  53.     }  
  54.     ComputeHash((BYTE *)&resHash[0],hashVec.size()*16,CALG_MD5,pbOutHash,dwHashLen);  
  55.     for (i=0;i<dwHashLen;i++)  
  56.         printf("%x " ,pbOutHash[i]);  
  57.     printf("/n" );  
  58.     delete [] pbData;  
  59.     fclose(file);  
  60.     delete  pbOutHash;  
  61.     return  0;  
  62. }  
  63. DWORD  ComputeHash(CONST  BYTE  *pbData,  DWORD  dwDataLen, ALG_ID algId,   
  64.                   BYTE *& pbOutHash,  DWORD & dwHashLen, BOOL  showDBInfo)  
  65. {  
  66.     char  UserName[10]= "wangxijie" ;  
  67.     HCRYPTHASH hHash={0};  
  68.     HCRYPTPROV hCryptProv;  
  69.     if (CryptAcquireContext(  
  70.         &hCryptProv,               // 返回CSP句柄   
  71.         UserName,                  // 密码容器名   
  72.         NULL,                      // NULL时使用默认CSP名(微软RSA Base Provider)   
  73.         PROV_RSA_FULL,             // CSP类型   
  74.         0))                        // Flag values   
  75.     {  
  76.         //以UserName为名的密钥容器存在,那么我们已经得到了CSP的句柄   
  77.         if (showDBInfo)  
  78.         {  
  79.             printf("A crypto context with the %s key container /n" , UserName);  
  80.             printf("has been acquired./n" );  
  81.         }  
  82.     }  
  83.     else   //如果密钥容器不存在,我们需要创建这个密钥容器   
  84.     {   
  85.         if (CryptAcquireContext(  
  86.             &hCryptProv,   
  87.             UserName,   
  88.             NULL,   
  89.             PROV_RSA_FULL,   
  90.             CRYPT_NEWKEYSET)) //创建以UserName为名的密钥容器   
  91.         {  
  92.             //创建密钥容器成功,并得到CSP句柄   
  93.             if (showDBInfo)  
  94.                 printf("A new key container has been created.%s/n" ,UserName);  
  95.         }  
  96.         else   
  97.         {  
  98.             if (showDBInfo)  
  99.                 printf("Could not create a new key container./n" );  
  100.         }  
  101.     } // End of else   
  102.       
  103.       
  104.     if (CryptCreateHash(  
  105.         hCryptProv,   
  106.         algId,   
  107.         0,   
  108.         0,   
  109.         &hHash))  
  110.     {  
  111.         if (showDBInfo)  
  112.             printf("A hash object has been created. /n" );  
  113.     }  
  114.     else   
  115.     {   
  116.         if (showDBInfo)  
  117.             printf("Error during CryptCreateHash!/n" );  
  118.     }    
  119.       
  120.     DWORD  dwReturn;  
  121. //  char pbData[100]="wangxijie/0";   
  122. //  int  dwDataLen=strlen(pbData);   
  123.     if (!CryptHashData(hHash, (byte*)&pbData[0], dwDataLen, 0))  
  124.     {  
  125.         dwReturn = GetLastError();  
  126.         CryptDestroyHash(hHash);  
  127.         CryptReleaseContext(hCryptProv, 0);  
  128.         return  dwReturn;  
  129.     }  
  130.       
  131.       
  132.     //DWORD dwHashLen;   
  133.     DWORD  dwLen =  sizeof (dwHashLen);  
  134.     CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE *)(&dwHashLen), &dwLen, 0);  
  135.       
  136.     //BYTE* pbOutHash;   
  137.     pbOutHash = new   BYTE [dwHashLen];  
  138.     dwLen = dwHashLen;  
  139.     CryptGetHashParam(hHash, HP_HASHVAL, pbOutHash, &dwLen, 0);  
  140.       
  141. //  for(int i=0;i<dwHashLen;i++)   
  142. //      printf("%x ",pbOutHash[i]);   
  143. //  printf("/n");   
  144.       
  145.     //destory   
  146.     CryptDestroyHash(hHash);  
  147.     if (hCryptProv)   
  148.         CryptReleaseContext(hCryptProv,0);  
  149.     return  0;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值