實現自解壓的文件加密和解密。
界面操作,獨立執行文件,尺寸夠小,能夠自解壓。
實現思路:打包程序可以對文件進行加密和解密。同時支持生成自解壓程序的能力。
生成自解壓的過程是:打包程序對目標文件進行加密,釋放出自解壓程序並追加加密後的內容,形成包含加密後內容的可執行文件。
自解壓的過程是:自解壓程序執行時,對包含的加密信息進行解密,並生成解密後的文件。
選用原生的window api,加解密選用wincrypt
打包程序界面
自解壓程序界面
int FPCrypt::EncryptFile(LPWSTR szSrcFile, LPWSTR szToFile)
{
int iReturn = 0;
bool fEOF = FALSE;
HANDLE hSrcFile = INVALID_HANDLE_VALUE;
HANDLE hDestFile = INVALID_HANDLE_VALUE;
PBYTE pbBuffer = NULL;
DWORD dwBufferLen = 0;
DWORD dwCount = 0;
hSrcFile = CreateFile(szSrcFile, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hSrcFile)
{
iReturn = 9001;
goto Exit_MyEncryptFile;
}
hDestFile = CreateFile(szToFile, FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hDestFile)
{
iReturn = 9001;
goto Exit_MyEncryptFile;
}
dwBufferLen = dwBlockLength + ENCRYPT_BLOCK_SIZE;
pbBuffer = (BYTE*)malloc(dwBufferLen);
do
{
if (!ReadFile(hSrcFile, pbBuffer, dwBlockLength, &dwCount, NULL))
{
iReturn = 9008;
goto Exit_MyEncryptFile;
}
if (dwCount < dwBlockLength)
{
fEOF = TRUE;
}
if (!CryptEncrypt(hKey, NULL, fEOF, 0, pbBuffer, &dwCount, dwBufferLen))
{
iReturn = 9009;
goto Exit_MyEncryptFile;
}
if (!WriteFile(hDestFile, pbBuffer, dwCount, &dwCount, NULL))
{
iReturn = 9010;
goto Exit_MyEncryptFile;
}
} while (!fEOF);
Exit_MyEncryptFile:
if (pbBuffer)
{
free(pbBuffer);
}
if (hSrcFile)
{
CloseHandle(hSrcFile);
}
if (hDestFile)
{
CloseHandle(hDestFile);
}
return iReturn;
}
下一篇