接口定义:
// 加密数据 static BOOL xEncrypt(BYTE *pbSourceData, DWORD dwSourceDataLen, BYTE **pbDestData, DWORD *pdwDestDataLen, LPCTSTR lpszPassword); // 解密数据 static BOOL xDecrypt(BYTE *pbSourceData, DWORD dwSourceDataLen, BYTE **pbDestData, DWORD *pdwDestDataLen, LPCTSTR lpszPassword); // 加密文件 static BOOL xEncrypt(LPCTSTR lpszSource, LPCTSTR lpszDestination, LPCTSTR lpszPassword); // 解密文件 static BOOL xDecrypt(LPCTSTR lpszSource, LPCTSTR lpszDestination, LPCTSTR lpszPassword);接口声明:
// 加密数据 BOOL xEncrypt(BYTE *pbSourceData, DWORD dwSourceDataLen, BYTE **pbDestData, DWORD *pdwDestDataLen, LPCTSTR lpszPassword) { HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; HCRYPTKEY hKey = 0, hXchgKey = 0; PBYTE pbBuffer = NULL, pbKeyBlob = NULL; BOOL bEOF = FALSE, bReturn = FALSE; DWORD dwCount = 0, dwKeyBlobLen = 0; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { DWORD ret = GetLastError(); if (ret != NTE_BAD_KEYSET) { goto exit; } else { if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { goto exit; } } } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { goto exit; } if (!CryptHashData(hHash, (PBYTE)lpszPassword, _tcslen(lpszPassword), 0)) { goto exit; } if (!CryptDeriveKey(hProv, CALG_RC2, hHash, 0, &hKey)) { goto exit; } if ((pbBuffer = (PBYTE)malloc(BUFFER_SIZE)) == NULL) { goto exit; } memset(pbBuffer, 0, BUFFER_SIZE); memcpy(pbBuffer, pbSourceData, dwSourceDataLen); dwCount = dwSourceDataLen; bEOF = TRUE; if (!CryptEncrypt(hKey, 0, bEOF, 0, pbBuffer, &dwCount, BUFFER_SIZE)) { goto exit; } *pbDestData = (PBYTE)malloc(dwCount); memcpy(*pbDestData, pbBuffer, dwCount); *pdwDestDataLen = dwCount; bReturn = TRUE; exit: if (pbKeyBlob) free(pbKeyBlob); if (hKey) CryptDestroyKey(hKey); if (pbBuffer) free(pbBuffer); if (hXchgKey) CryptDestroyKey(hXchgKey); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv, 0); return bReturn; } // 解密数据 BOOL xDecrypt(BYTE *pbSourceData, DWORD dwSourceDataLen, BYTE **pbDestData, DWORD *pdwDestDataLen, LPCTSTR lpszPassword) { HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; HCRYPTKEY hKey = 0; PBYTE pbBuffer = NULL, pbKeyBlob = NULL; BOOL bEOF = 0, bReturn = FALSE; DWORD dwCount = 0, dwKeyBlobLen = 0; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { DWORD ret = GetLastError(); if (ret != NTE_BAD_KEYSET) { goto exit; } else { if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { goto exit; } } } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { goto exit; } if (!CryptHashData(hHash, (PBYTE)lpszPassword, _tcslen(lpszPassword), 0)) { goto exit; } if (!CryptDeriveKey(hProv, CALG_RC2, hHash, 0, &hKey)) { goto exit; } if ((pbBuffer = (PBYTE)malloc(BUFFER_SIZE)) == NULL) { goto exit; } memset(pbBuffer, 0, BUFFER_SIZE); memcpy(pbBuffer, pbSourceData, dwSourceDataLen); dwCount = dwSourceDataLen; bEOF = TRUE; if (!CryptDecrypt(hKey, 0, bEOF, 0, pbBuffer, &dwCount)) { TRACE(_T("GetLastError()=%d"),GetLastError()); goto exit; } *pbDestData = (PBYTE)malloc(dwCount); memcpy(*pbDestData, pbBuffer, dwCount); *pdwDestDataLen = dwCount; bReturn = TRUE; exit: if (pbKeyBlob) free(pbKeyBlob); if (hKey) CryptDestroyKey(hKey); if (pbBuffer) free(pbBuffer); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv, 0); return bReturn; } // 加密文件 BOOL xEncrypt(LPCTSTR lpszSource, LPCTSTR lpszDestination, LPCTSTR lpszPassword) { FILE *hSrcFile = NULL, *hDestFile = NULL; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; HCRYPTKEY hKey = 0, hXchgKey = 0; PBYTE pbBuffer = NULL, pbKeyBlob = NULL; BOOL bEOF = FALSE, bReturn = FALSE; DWORD dwCount = 0, dwKeyBlobLen = 0; if (fopen_s(&hSrcFile, lpszSource, _T("rb")) != 0) { goto exit; } if (fopen_s(&hDestFile, lpszDestination, _T("wb")) != 0) { goto exit; } if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { DWORD ret = GetLastError(); if (ret != NTE_BAD_KEYSET) { goto exit; } else { if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { goto exit; } } } if (lpszPassword == NULL) { if (!CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKey)) { goto exit; } if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)) { DWORD ret = GetLastError(); if (ret != NTE_NO_KEY) { goto exit; } if (!CryptGenKey(hProv, AT_KEYEXCHANGE, NULL, &hXchgKey)) { goto exit; } } if (!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwKeyBlobLen)) { goto exit; } if ((pbKeyBlob = (PBYTE)malloc(dwKeyBlobLen)) == NULL) { goto exit; } if (!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwKeyBlobLen)) { goto exit; } fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestFile); if (ferror(hDestFile)) { goto exit; } fwrite(pbKeyBlob, 1, dwKeyBlobLen, hDestFile); if (ferror(hDestFile)) { goto exit; } } else { if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { goto exit; } if (!CryptHashData(hHash, (PBYTE)lpszPassword, _tcslen(lpszPassword), 0)) { goto exit; } if (!CryptDeriveKey(hProv, CALG_RC2, hHash, 0, &hKey)) { goto exit; } } if ((pbBuffer = (PBYTE)malloc(BUFFER_SIZE)) == NULL) { goto exit; } do { dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSrcFile); if (ferror(hSrcFile)) { goto exit; } bEOF = feof(hSrcFile); if (!CryptEncrypt(hKey, 0, bEOF, 0, pbBuffer, &dwCount, BUFFER_SIZE)) { goto exit; } fwrite(pbBuffer, 1, dwCount, hDestFile); if (ferror(hDestFile)) { goto exit; } } while (!bEOF); bReturn = TRUE; exit: if (hSrcFile) fclose(hSrcFile); if (hDestFile) fclose(hDestFile); if (pbKeyBlob) free(pbKeyBlob); if (pbBuffer) free(pbBuffer); if (hKey) CryptDestroyKey(hKey); if (hXchgKey) CryptDestroyKey(hXchgKey); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv, 0); return bReturn; } // 解密文件 BOOL xDecrypt(LPCTSTR lpszSource, LPCTSTR lpszDestination, LPCTSTR lpszPassword) { FILE *hSrcFile = NULL, *hDestFile = NULL; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; HCRYPTKEY hKey = 0; PBYTE pbBuffer = NULL, pbKeyBlob = NULL; BOOL bEOF = 0, bReturn = FALSE; DWORD dwCount = 0, dwKeyBlobLen = 0; if (fopen_s(&hSrcFile, lpszSource, _T("rb")) != 0) { goto exit; } if (fopen_s(&hDestFile, lpszDestination, _T("wb")) != 0) { goto exit; } if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { DWORD ret = GetLastError(); if (ret != NTE_BAD_KEYSET) { goto exit; } else { if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { goto exit; } } } if (lpszPassword == NULL) { fread(&dwKeyBlobLen, sizeof(DWORD), 1, hSrcFile); if (ferror(hSrcFile) || feof(hSrcFile)) { goto exit; } if ((pbKeyBlob = (PBYTE)malloc(dwKeyBlobLen)) == NULL) { goto exit; } fread(pbKeyBlob, 1, dwKeyBlobLen, hSrcFile); if (ferror(hSrcFile) || feof(hSrcFile)) { goto exit; } if (!CryptImportKey(hProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey)) { goto exit; } } else { if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { goto exit; } if (!CryptHashData(hHash, (PBYTE)lpszPassword, _tcslen(lpszPassword), 0)) { goto exit; } if (!CryptDeriveKey(hProv, CALG_RC2, hHash, 0, &hKey)) { goto exit; } } if ((pbBuffer = (PBYTE)malloc(BUFFER_SIZE)) == NULL) { goto exit; } do { dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSrcFile); if (ferror(hSrcFile)) { goto exit; } bEOF = feof(hSrcFile); if (!CryptDecrypt(hKey, 0, bEOF, 0, pbBuffer, &dwCount)) { goto exit; } fwrite(pbBuffer, 1, dwCount, hDestFile); if (ferror(hDestFile)) { goto exit; } } while (!bEOF); bReturn = TRUE; exit: if (hSrcFile) fclose(hSrcFile); if (hDestFile) fclose(hDestFile); if (pbKeyBlob) free(pbKeyBlob); if (pbBuffer) free(pbBuffer); if (hKey) CryptDestroyKey(hKey); if (hHash) CryptDestroyHash(hHash); if (hProv) CryptReleaseContext(hProv, 0); return bReturn; }