На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> CryptEncrypt.WINAPI , CryptEncrypt.WINAPI
    Всем привет.
    Пишу на Си.
    Пытаюсь при помощи WINAPI открыть файл,отобразить его в памяти,зашифровать данные и записать в другой файл.
    Но CryptEncrypt не выполняется,новый файл получается точь в точь со старым, а strerror(errno) пишет "no errors".
    Может кто подскажет,что я не так делаю.
    Спасибо за внимание.
    ExpandedWrap disabled
      #include <stdio.h>
      #include <stdlib.h>
      #include <windows.h>
      #include <wincrypt.h>
       
      #define PKEY_PATH 57
       
      #define ERROR_CREATE_THREAD -11
      #define ERROR_JOIN_THREAD   -12
      #define SUCCESS               0
       
      #define ALG_SID_SHA_256                 12
      #define CALG_SHA_256            (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256)
       
      int main(void)
      {
          const char *fname = "E:\\disasm.txt";
          const char *fname2 = "E:\\CryptEncrypt.txt";
          HANDLE hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          HANDLE out = CreateFile(fname2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
          if(INVALID_HANDLE_VALUE == hFile || INVALID_HANDLE_VALUE == out) { //OPEN_ALWAYS
              printf("fileMappingCreate - CreateFile failed, fname = %s\r\n", fname);
              getchar();
              return 0;
          }
       
          DWORD dwFileSize = GetFileSize(hFile, NULL);
          if(dwFileSize == INVALID_FILE_SIZE) {
              printf("fileMappingCreate - GetFileSize failed, fname = %s\r\n", fname);
              CloseHandle(hFile);
              CloseHandle(out);
              getchar();
              return 0;
          }
       
          HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
          if(hMapping == NULL) {
              printf("fileMappingCreate - CreateFileMapping failed, fname = %s\r\n", fname);
              CloseHandle(hFile);
              CloseHandle(out);
              getchar();
              return 0;
          }
       
          unsigned char* dataPtr = (unsigned char*)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwFileSize);
          if(dataPtr == NULL) {
              printf("fileMappingCreate - malloc failed, fname = %s\r\n", fname);
              CloseHandle(hMapping);
              CloseHandle(hFile);
              CloseHandle(out);
              getchar();
              return 0;
          }
       
          HCRYPTPROV  hProv = { 0 };
          HCRYPTKEY   hKey = { 0 };
          HCRYPTHASH  hHash = { 0 };
       
          char pKey[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
       
          CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
          CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash);
          CryptHashData(hHash, (BYTE *)pKey, strlen(pKey), 0);
          CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey);
       
       
          if(!CryptEncrypt(hKey, 0, TRUE, 0, (PBYTE)dataPtr, &dwFileSize, dwFileSize))
          {
              printf("%s\r\n", strerror(errno));
          }
       
          WriteFile(out, dataPtr, dwFileSize, &dwFileSize, NULL );
       
          printf("complete");
       
          getchar();
       
          CryptDestroyHash(hHash);
          CryptDestroyKey(hKey);
          CryptReleaseContext(hProv, 0);
          UnmapViewOfFile(dataPtr);
          CloseHandle(hMapping);
          CloseHandle(hFile);
          CloseHandle(out);
       
          return 0;
      }
      В общем,переписал код.Шифрование работает,а вот расшифровать не получается...
      strerror(errno) так же пишет "no errors -2146893819".
      ExpandedWrap disabled
        #include <stdio.h>
        #include <stdlib.h>
        #include <windows.h>
        #include <wincrypt.h>
        #include <tchar.h>
         
        #define VARNAME TEXT("NUMBER_OF_PROCESSORS")
        #define BUFSIZE 4096
         
        #define PKEY_PATH 57
         
        #define ERROR_CREATE_THREAD -11
        #define ERROR_JOIN_THREAD   -12
        #define SUCCESS               0
         
        #define ALG_SID_SHA_256                 12
        #define CALG_SHA_256            (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256)
         
        HCRYPTPROV  hProv = { 0 };
        HCRYPTKEY   hKey = { 0 };
        HCRYPTHASH  hHash = { 0 };
         
        void encrypt(const char *fname);
        void decrypt(const char *fname);
         
        unsigned char *Read(const char* filename, DWORD* bufferSize);
         
        int main(void)
        {
            SetErrorMode (SEM_NOALIGNMENTFAULTEXCEPT);
            UINT fuOldErrorMode = SetErrorMode (0);
            C_ASSERT (fuOldErrorMode == SEM_NOALIGNMENTFAULTEXCEPT);
         
            TCHAR buf[BUFSIZE];
            DWORD dwRet = GetEnvironmentVariable(VARNAME, buf, BUFSIZE);
            if (dwRet > 0 && dwRet < BUFSIZE)
                _tprintf(_T("Number of processors: %s\n"), buf);
         
            char pKey[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
         
            if(!CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) printf("CryptAcquireContext %s\r\n", strerror(errno));
            if(!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) printf("CryptCreateHash %s\r\n", strerror(errno));
            if(!CryptHashData(hHash, (BYTE *)pKey, strlen(pKey), 0)) printf("CryptHashData %s\r\n", strerror(errno));
            if(!CryptDeriveKey(hProv, CALG_AES_192, hHash, CRYPT_EXPORTABLE, &hKey)) printf("CryptDeriveKey %s\r\n", strerror(errno));
         
            const char *fname = "E:\\123.txt";
         
            // encrypt(fname);
            decrypt(fname);
         
            CryptDestroyHash(hHash);
            CryptDestroyKey(hKey);
            CryptReleaseContext(hProv, 0);
         
            printf("complete");
         
            getchar();
         
            return 0;
        }
         
        void encrypt(const char *fname)
        {
            DWORD dataSize;
            BYTE *dataPtr = Read(fname, &dataSize);
            printf("%s %ld\r\n", fname, dataSize);
         
            if(!CryptEncrypt(hKey, 0, TRUE, 0, dataPtr, &dataSize, dataSize + 10240)) {
                DWORD error = GetLastError();
                printf("%s %ld\r\n", strerror(errno), error);
            }
         
            // printf("%s\r\n", dataPtr);
         
            UnmapViewOfFile(dataPtr);
         
            return;
        }
         
        void decrypt(const char *fname)
        {
            DWORD dataSize;
            BYTE *dataPtr = Read(fname, &dataSize);
            printf("%s %ld\r\n", fname, dataSize);
         
            if(!CryptDecrypt(hKey, 0, TRUE, 0, dataPtr, &dataSize)) {
                DWORD error = GetLastError();
                printf("%s %ld\r\n", strerror(errno), error);
            }
         
            UnmapViewOfFile(dataPtr);
         
            return;
        }
         
        unsigned char *Read(const char* filename, DWORD* bufferSize)
        {
            HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
            if(INVALID_HANDLE_VALUE == hFile) { //OPEN_ALWAYS
                printf("fileMappingCreate - CreateFile failed, in fname = %s\r\n", filename);
                getchar();
                return 0;
            }
         
            *bufferSize = GetFileSize(hFile, NULL);
            if(*bufferSize == INVALID_FILE_SIZE) {
                printf("fileMappingCreate - GetFileSize failed, fname = %s\r\n", filename);
                CloseHandle(hFile);
                getchar();
                return 0;
            }
         
            HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
            if(hMapping == NULL) {
                printf("fileMappingCreate - CreateFileMapping failed, fname = %s\r\n", filename);
                CloseHandle(hFile);
                getchar();
                return 0;
            }
         
            unsigned char* dataPtr = (unsigned char*)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, *bufferSize);
            if(dataPtr == NULL) {
                printf("fileMappingCreate - malloc failed, fname = %s\r\n", filename);
                CloseHandle(hMapping);
                CloseHandle(hFile);
                getchar();
                return 0;
            }
         
            CloseHandle(hMapping);
            CloseHandle(hFile);
         
            return dataPtr;
        }
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0213 ]   [ 16 queries used ]   [ Generated: 28.03.24, 14:39 GMT ]