zoukankan      html  css  js  c++  java
  • win api 实现 AES加密、解密,获取HASH

         WCHAR szPasswod[] = {L"goodpasswod"    };
            HCRYPTHASH hHash;
            HCRYPTPROV hCryptProv;
            HCRYPTKEY    hKey;
        
            DWORD dwHashLen = 0;
            DWORD dwhash = 4; 
            BYTE byHash[] ={"123456789012345678"};
            BYTE bySrc[] = {"123456789012345678901234567890"};
            BYTE byDest[64] = {0};
            memcpy(byDest,bySrc,32);
            int iret = -1 ;
            int idx = 0 ;
            WCHAR* wszProvider[] = {MS_ENH_RSA_AES_PROV,L"Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"};
        
            while(!(iret = CryptAcquireContext(&hCryptProv,NULL,wszProvider[idx],PROV_RSA_AES,CRYPT_SILENT)))
            {
                idx ++ ;
                idx %= 2 ;
            }
        
            // passwd to hash 
            CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash);
         // use passwd to create hash
    //CryptHashData(hHash,(BYTE*)szPasswod,wcslen(szPasswod)*2,0);
        
         // set hash CryptGetHashParam(hHash,HP_HASHSIZE,(BYTE*)&dwHashLen,&dwhash,0); // hashlen = 16 CryptSetHashParam(hHash,HP_HASHVAL ,byHash,dwHashLen); CryptDeriveKey(hCryptProv,CALG_AES_128,hHash,CRYPT_EXPORTABLE,&hKey); // CRYPT_EXPORTABLE DWORD dwLen =31; DWORD dwLen1 = 31 ; DWORD dwBufferLen = 48 ;
         //get crypt need buffer-len CryptEncrypt(hKey,
    0,TRUE,0,byDest,&dwLen,0);
         // alloc buffer that`s len should be dwlen CryptEncrypt(hKey,
    0,TRUE,0,byDest,&dwLen1,dwLen); MessageBoxA(NULL,(LPSTR)byDest,(LPSTR)byDest,0); CryptDecrypt(hKey,0,TRUE,0,byDest,&dwLen); MessageBoxA(NULL,(LPSTR)byDest,(LPSTR)byDest,0); CryptDestroyHash(hHash); CryptDestroyKey(hKey); CryptReleaseContext(hCryptProv,0);

    测试发现兼容 xp,win7(x64) 

    LPBYTE GetHash(LPBYTE lpData, DWORD dwDataLen,LPDWORD lpdwOutLen)
    {
    	HCRYPTPROV hCryptProv;
    	HCRYPTHASH hHash;
    	LPBYTE lpRetBuffer = NULL ;
    	
    
    	//--------------------------------------------------------------------
    	// Get a handle to a cryptography provider context.
    
    	
    
    
    	if(CryptAcquireContext(
    		&hCryptProv, 
    		NULL, 
    		NULL, 
    		PROV_RSA_FULL, 
    		CRYPT_VERIFYCONTEXT)) 
    	{
    	//	printf("CryptAcquireContext complete. 
    ");
    	
    	//--------------------------------------------------------------------
    	// Acquire a hash object handle.
    
    		if(CryptCreateHash(
    			hCryptProv, 
    			CALG_MD5, 
    			0, 
    			0, 
    			&hHash)) 
    		{
    			if(CryptHashData(hHash,lpData,dwDataLen,0))
    			{
    				//CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, 0);
    				CryptSetHashParam(hHash,HP_HASHSIZE,(BYTE*)lpdwOutLen,sizeof(DWORD));
    
    				lpRetBuffer =(LPBYTE) BPP_ReAlloc(NULL,0,*lpdwOutLen);
    				CryptGetHashParam(hHash, HP_HASHVAL, lpRetBuffer, lpdwOutLen, 0);
    			}
    
    		}
    	}
    
    	if(hHash) 
    		CryptDestroyHash(hHash);
    	if(hCryptProv) 
    		CryptReleaseContext(hCryptProv,0);
    
    	return lpRetBuffer ;
    }
    

      

    LPBYTE Encrypt(LPBYTE lpData,LPDWORD lpdwInOutLen)
    {
    	HCRYPTPROV hCryptProv =NULL ;
    	HCRYPTKEY hKey = NULL ;
    	HCRYPTHASH hHash = NULL ;
    
    	char* szId =NULL ;
    	LPBYTE lpRetBuf = NULL ;
    	DWORD dwLen ;
    	dwLen = *lpdwInOutLen ;
    
    
    	if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0))
    	{
    		if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET))
    		{
    			goto EncryptEnd  ;
    		}
    	}
    
    	if (!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
    	{
    		goto EncryptEnd  ;
    	}
    
    	szId = GetIdStr(); // pswd
    
    	if (!CryptHashData(hHash,(BYTE*)szId,strlen(szId),0))
    	{
    		
    		goto EncryptEnd  ;
    	}
    	
    
    	if (!CryptDeriveKey(hCryptProv,CALG_RC4,hHash,0x00800000,&hKey))
    	{
    		dwLen = GetLastError();
    		goto EncryptEnd  ;
    	}
    
    	// qu jia mi suo xu chang du 
    
    //	dwLen = ((dwLen%8 ?1:0) + dwLen/8)*8 ;
    
    	lpRetBuf = (LPBYTE)malloc(dwLen);
         memcpy(lpRetBuf,lpData,*lpdwInOutLen); if (!CryptEncrypt(hKey,0,TRUE,0,lpRetBuf,lpdwInOutLen,dwLen)) { goto EncryptEnd ; } EncryptEnd: if (szId) { Free((LPVOID&)szId); } if (hHash) { CryptDestroyHash(hHash); } if (hKey) { CryptDestroyKey(hKey); } if (hCryptProv) { CryptReleaseContext(hCryptProv,0); } return lpRetBuf ; } LPBYTE Decrypt(LPBYTE lpData,LPDWORD lpdwInOutLen) { HCRYPTPROV hCryptProv =NULL ; HCRYPTKEY hKey = NULL ; HCRYPTHASH hHash = NULL ; char* szId =NULL ; LPBYTE lpRetBuf = NULL ; DWORD dwLen ; dwLen = *lpdwInOutLen ; if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0)) { if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) { goto DecryptEnd ; } } if (!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash)) { goto DecryptEnd ; } szId = GetIdStr(); if (!CryptHashData(hHash,(BYTE*)szId,strlen(szId),0)) { goto DecryptEnd ; } if (!CryptDeriveKey(hCryptProv,CALG_RC4,hHash,CRYPT_EXPORTABLE,&hKey)) { dwLen = GetLastError(); goto DecryptEnd ; } // qu jia mi suo xu chang du //dwLen = ((dwLen%8 ?1:0) + dwLen/8)*8 ; lpRetBuf = (LPBYTE)malloc(dwLen); memcpy(lpRetBuf,lpData,*lpdwInOutLen); //*lpdwInOutLen = dwLen ; if (!CryptDecrypt(hKey,0,TRUE,0,lpRetBuf,lpdwInOutLen)) { goto DecryptEnd ; } DecryptEnd: if (szId) { BPP_Free((LPVOID&)szId); } if (hHash) { CryptDestroyHash(hHash); } if (hKey) { CryptDestroyKey(hKey); } if (hCryptProv) { CryptReleaseContext(hCryptProv,0); } return lpRetBuf ; }

      

    签名档: 从事网络安全和编程的我,很希望能找到志同道合的朋友交流。 欢迎cn博客的好友拍砖,留言。
  • 相关阅读:
    jsonp跨域请求
    jQuery之异步Ajax请求使用
    table表格cellspacing与cellpadding属性
    常用正则匹配
    插入数据显示 Duplicate entry '4913' for key 'user_id'
    事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
    python 协程
    python 进程 线程
    python 并发socketserver模块
    python 网络 socket
  • 原文地址:https://www.cnblogs.com/M4ster/p/win_api_aes.html
Copyright © 2011-2022 走看看