Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.163.200.109] |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Пишу на Си. Пытаюсь при помощи WINAPI открыть файл,отобразить его в памяти,зашифровать данные и записать в другой файл. Но CryptEncrypt не выполняется,новый файл получается точь в точь со старым, а strerror(errno) пишет "no errors". Может кто подскажет,что я не так делаю. Спасибо за внимание. #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; } |
Сообщ.
#2
,
|
|
|
В общем,переписал код.Шифрование работает,а вот расшифровать не получается...
strerror(errno) так же пишет "no errors -2146893819". #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; } |