CryptoAPI函数测试实例代码(二)

2014-11-23 23:30:16 · 作者: · 浏览: 23
YTE*)szPassword, strlen(szPassword), 0 ); #endif bRet = ::CryptDeriveKey( hCryptProv, CALG_RC2, hHash, 0x00800000|CRYPT_EXPORTABLE, &hKey ); if( FALSE == bRet ) break; ::CryptDestroyHash( hHash ); hHash = NULL; const int ENCRYPT_BLOCK_SIZE = 8; DWORD dwBufferLen = 1000 - 1000%8 + 8; // 每次加密的字节数 DWORD dwEncrypt = 0; // 到目前为止加密了多少数据 do { BOOL bFinal = dwEncrypt + dwBufferLen >= (DWORD)nOriLen; DWORD dwDataLen = bFinal nOriLen-dwEncrypt : dwBufferLen; bRet = ::CryptEncrypt( hKey, 0, bFinal, 0, bOrign+dwEncrypt, &dwDataLen, dwDataLen ); if( FALSE == bRet ) { DWORD dwErr = ::GetLastError(); break; } dwEncrypt += dwBufferLen; if( bFinal ) break; } while( true ); } while( false ); if( hKey ) ::CryptDestroyKey( hKey ); if( hHash ) ::CryptDestroyHash( hHash ); if( hCryptProv ) ::CryptReleaseContext( hCryptProv, 0 ); } // // 函数:DWORD WINAPI ImportRootCertAutoClickProc( LPVOID lpParameter ) // // 目的:在导入一个根证书的时候,由程序来自动点击确定按钮 // DWORD WINAPI ImportRootCertAutoClickProc( LPVOID lpParameter ) { int nRetryTimes = 20; int nSleepTime = 200; HWND hWnd = NULL; bool bFinish = false; TCHAR titleR[64] = _T("根证书存储"); // 卸载根证书的对话框标题 TCHAR titleI_xp[64] = _T("安全警告"); // xp下,导入根证书的对话框标题 TCHAR titleI_win7[64] = _T("安全性警告"); // win7下,导入根证书的对话框标题 for( int i = 0; i < nRetryTimes; i++ ) { if( bFinish ) break; Sleep(nSleepTime); hWnd = FindWindow( _T("#32770"), titleR ); if( !hWnd) { HWND hWndXp = FindWindow( _T("#32770"), titleI_xp ); HWND hWndWin7 = FindWindow( _T("#32770"), titleI_win7 ); if( hWndXp != NULL || hWndWin7 != NULL ) { bFinish = true; hWnd = ( hWndXp == NULL hWndWin7:hWndXp ); } else continue; } SendMessage(hWnd, WM_COMMAND, MAKELONG(IDYES, BN_CLICKED), (long)GetDlgItem( hWnd, IDYES )); } return 0; } // // 函数:DWORD WINAPI RemoveRootCertAutoClickProc( LPVOID lpParameter ) // // 目的:在删除一个根证书的时候,由程序来自动点击确定按钮 // DWORD WINAPI RemoveRootCertAutoClickProc( LPVOID lpParameter ) { int nRetryTimes = 20; int nSleepTime = 200; HWND hWnd = NULL; bool bFinish = false; TCHAR titleR[64] = _T("根证书存储"); // 卸载根证书的对话框标题 for( int i = 0; i < nRetryTimes; i++ ) { Sleep(nSleepTime); hWnd = FindWindow( _T("#32770"), titleR ); if( hWnd) { SendMessage(hWnd, WM_COMMAND, MAKELONG(IDYES, BN_CLICKED), (long)GetDlgItem( hWnd, IDYES )); break; } else continue; } return 0; } // // 函数: bool ImportPfxCert( TCHAR* szCertPath, TCHAR* szPassword, WCHAR* wcsImportToWhere, TCHAR* szErrInfo = NULL ) // // 目的: 导入一张PFX证书到IE中的wcsImportToWhere指定的区域 // // 参数 // szCertPath // [in]: p12证书所在路径 // szPassword // [in]: p12证书的密码 // wcsImportToWhere // [in]: L"MY", L"CA", L"ROOT" // szErrInfo // [out]: 如果错误,返回错误信息 // // 返回: 成功返回true,失败返回false // bool ImportPfxCert( TCHAR* szCertPath, TCHAR* szPassword, WCHAR* wcsImportToWhere, TCHAR* szErrInfo ) { bool nRet = false; HCERTSTORE hCertStore = NULL; HCERTSTORE hCertStoreToWhere = NULL; PCCERT_CONTEXT pCertContex = NULL; HCRYPTPROV hCryptProv = NULL; do { CBufferT
bufCert; if( FALSE == GetFileBuffer( szCertPath, bufCert ) ) { if( szErrInfo != NULL ) { _stprintf( szErrInfo, _T("读取证书文件数据失败") ); } break; } CRYPT_DATA_BLOB blob; blob.cbData = bufCert.GetBufSize(); blob.pbData = (unsigned char *)(char*)bufCert; #ifdef _UNICODE hCertStore = PFXImportCertStore( &blob, szPassword, CRYPT_EXPORTABLE ); #else int nPswdLen = ::MultiByteToWideChar( CP_ACP, 0, szPassword, strlen( szPassword )+1, NULL, 0 ); CBufferT wcsPassword; wcsPassword.malloc( nPswdLen ); ::MultiByteToWideChar( CP_ACP, 0, szPassword, strlen( szPassword )+1, wcsPassword, nPswdLen ); hCertStore = PFXImportCertStore( &blob, wcsPassword, CRYPT_EXPORTABLE ); #endif if( NULL == hCertStore ) { if( NULL != szErrInfo ) { DWORD dwError = ::GetLastError(); _stprintf( szErrInfo, _T("PFXImportCertStore FAILED, Error Code: 0x%X。请确认密码是否正确。 "), dwError ); } break; } // 从临时区找到刚才那张证书,导入到MY里面 BOOL bCertFound = FALSE; DWORD dwKeySpec = 0; BOOL boCallerFreeProv = FALSE; do { pCertContex = CertEnumCertificatesInStore(hCertStore,pCertContex); if (!pCertContex) break; if (CryptAcquireCertificatePrivateKey(pCertContex, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL,&hCryptProv,&dwKeySpec,&boCallerFreeProv) && hCryptProv) { bCertFound = TRUE; break; } }while(1); if( FALSE == bCertFound ) break; hCertStoreToWhere = ::CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, wcsImportToWhere ); if( NULL == hCertStoreToWhere ) { if( NULL != szErrInfo ) { _tcscpy( szErrInfo, _T("CertOpenStoren Failed") ); } break; } // 自动选择是按钮 if( 0 == wcscmp( L"ROOT", wcsImportToWhere ) ) { CreateThread( NULL, 0, ImportRootCertAutoClickProc, 0, 0, 0 ); } BOOL bRet = ::CertAddCertificateContextToStore( hCertStoreToWhere, pCertContex, CERT_STORE_ADD_REPLACE_EXISTING, NULL ); if( !bRet ) { if( NULL != szErrInfo ) { DWORD dwError = ::GetLastE