Выкладываю исходники. Если есть критика - буду рад.
| Код | #include "openssl-0.9.8i\blowfish.h" //... //--------------------------------------------------------------------------- //TODO: bBlowfishCrypt bool bBlowfishCrypt(FILE *pFileIn, FILE *pFileOut, int iMode, const string &сsBlowfishCryptKey) { //------------------------------------- //CHECK if (NULL == pFileIn || NULL == pFileOut) { return false; } if (!(BF_ENCRYPT == iMode) && !(BF_DECRYPT == iMode) ) { return false; } if (true == сsBlowfishCryptKey.empty()) { return false; }
//------------------------------------- //переменные int iNum = 0; const unsigned int cuiBuffSize = 1024; unsigned char ucBuffIn [cuiBuffSize]; memset(ucBuffIn, 0, sizeof(unsigned char) * cuiBuffSize); unsigned char ucBuffOut[cuiBuffSize]; memset(ucBuffOut, 0, sizeof(unsigned char) * cuiBuffSize); //------------------------------------- //Ключ шифрования длиной 128 бит и вектор инициализации unsigned char ucIv[8] = {'0', '1', '2', '3', '4', '5', '6', '7'}; //memset(ucIv, 0, sizeof(unsigned char) * 8);
size_t uiKeySize = sizeof(unsigned char) * сsBlowfishCryptKey.size(); unsigned char *pucKey = (unsigned char *)malloc(uiKeySize); if (pucKey == NULL) { return false; } memset(pucKey, 0, uiKeySize);
if (false == bStrToUCHAR(сsBlowfishCryptKey, pucKey, сsBlowfishCryptKey.size())) { /*LOG*/Console.bWriteErrLine("bStrToUCHAR() == false"); free(pucKey); pucKey = NULL;
return false; } //------------------------------------- //Помещаем ключ в структуру bfkey BF_KEY bfkey; BF_set_key(&bfkey, uiKeySize, pucKey); free(pucKey); pucKey = NULL; //------------------------------------- //Определяем что за файл (шифр / нешифр) switch (iMode) { case BF_ENCRYPT: { //запись штампа в вых. файл size_t uiWrited = fwrite(g_ucBlowfishStamp, 1, g_culBlowfishStampSize, pFileOut); if (uiWrited != g_culBlowfishStampSize) { /*LOG*/Console.bWriteErrLine("uiWrited != g_culBlowfishStampSize"); return false; } break; } case BF_DECRYPT: { //читаем файл начиная с конца штампа if (0 != fseek(pFileIn, g_culBlowfishStampSize, SEEK_SET)) { return false; } break; } } //------------------------------------- //Шифруем / расшифровуем блоки входного файла for (;;) { size_t uiInLen = fread(ucBuffIn, 1, cuiBuffSize, pFileIn); if (uiInLen <= 0) { break; } BF_cfb64_encrypt(ucBuffIn, ucBuffOut, uiInLen, &bfkey, ucIv, &iNum , iMode); size_t uiWrited = fwrite(ucBuffOut, 1, uiInLen, pFileOut); if (uiWrited != uiInLen) { /*LOG*/Console.bWriteErrLine("uiWrited != uiInLen"); return false; } }
//------------------------------------- //файл шифрован, дописать в конец вых. файла шифрованый ucVerifyStamp if (BF_ENCRYPT == iMode) { unsigned char ucBuffOut2[g_culVerifyStampSize]; memset(ucBuffOut2, 0, sizeof(ucBuffOut2)); BF_cfb64_encrypt(g_ucVerifyStamp, ucBuffOut2, g_culVerifyStampSize, &bfkey, ucIv, &iNum , iMode); size_t uiWrited = fwrite(ucBuffOut2, 1, g_culVerifyStampSize, pFileOut); if (uiWrited != g_culVerifyStampSize) { /*LOG*/Console.bWriteErrLine("uiWrited != g_culVerifyStampSize"); return false; } } //------------------------------------- //файл дешифрован, проверяем что в конце есть ucVerifyStamp if (BF_DECRYPT == iMode) { //прочитать последние culVerifyStampSize байты unsigned char ucBuffOut3[g_culVerifyStampSize]; memset(ucBuffOut3, 0, sizeof(ucBuffOut3)); unsigned long int ulFileOutSize = ulFileSize(pFileOut); if (0 != fseek(pFileOut, ulFileOutSize - g_culVerifyStampSize, SEEK_SET)) { return false; } size_t uiOutLen = fread(ucBuffOut3, 1, g_culVerifyStampSize, pFileOut); if (g_culVerifyStampSize != uiOutLen) { return false; } rewind(pFileOut);
//сравниваем со ucVerifyStamp (0 - equal) int iRes = memcmp((const void *)g_ucVerifyStamp, (const void *)ucBuffOut3, g_culVerifyStampSize); if (0 != iRes) { return false; }
//есть ucVerifyStamp -> удаляем с конца "VerifySignature" if (false == bCutFileFromEnd(pFileOut, g_culVerifyStampSize)) { return false; } }
return true; } //... int main() { //... //------------------------------------- //создаём вх, вых файлы FILE *pFileIn = fopen(sFilePathIn.c_str(), "rb+"); if (NULL == pFileIn) { /*INFO*/Console.bWriteErrLine("Не могу открыть входной файл"); return false; } sFilePathOut = sFilePathIn + ".{" + sCreatePlainGUID() + "}"; //добавить расширение ".tmp" FILE *pFileOut = fopen(sFilePathOut.c_str(), "wb+"); if (NULL == pFileOut) { /*INFO*/Console.bWriteErrLine("Не могу открыть выходной файл"); return false; }
//------------------------------------- //шифр / дешифр bool bIsCrypted = bBlowfishCrypt(pFileIn, pFileOut, iBlowfishCryptMode, сsBlowfishCryptKey);
//------------------------------------- //закрываем вх, вых файлы fflush(pFileOut); fclose(pFileOut); fflush(pFileIn); fclose(pFileIn); //... }
|
|