-1

我正在尝试加密特定文件夹中的所有文件,并且当我尝试打印所有文件时,该文件夹具有子文件夹,但当我尝试加密所有文件时,它会一次又一次地加密同一个文件

void dirListFiles(wchar_t *startDir) {
HANDLE hFind;
WIN32_FIND_DATA wfd;
wchar_t path[99999];
char *enName;
const char *extension = ".enc";
int wcsChars;

wsprintf(path, L"%s\\*", startDir);

if ((hFind = FindFirstFile(path, &wfd)) == INVALID_HANDLE_VALUE) {
    return;
}

do {
    if ((wcsncmp(L".", wfd.cFileName, 1) !=0) && (wcsncmp(L"..", wfd.cFileName, 2) != 0) ) {
        wsprintf(path, L"%s\\%s", startDir, wfd.cFileName);
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            dirListFiles(path);
        } else {
            wcsChars = wcslen(path);
            char *szTo = new char[wcsChars + 1];
            szTo[wcsChars] = '\0';
            WideCharToMultiByte(CP_ACP, 0, path, -1, szTo, wcsChars, NULL, NULL);

            enName = (char *)malloc(strlen(szTo) + 1 + 4);
            strcpy(enName, szTo);
            strcat(enName, extension);
            // If i add this line it keeps on encrypting the same file
            //fencrypt(szTo, enName, (unsigned const char*)"1234567812345678");

            printf("%s\n", enName);

            delete[] szTo;
            free(enName);
        }
    }
} while(FindNextFile(hFind, &wfd));

if (GetLastError() != ERROR_NO_MORE_FILES) {
    FindClose(hFind);
    return;
}
}

如果我添加 fencrypt(szTo, enName, (unsigned const char*)"1234567812345678"); 然后它加密主文件夹中的文件G:\WinApp但是当它进入时G:\WinApp\ipch\winapp-1918e0a3它会一次又一次地加密同一个文件G:\WinApp\ipch\只有一个文件夹中没有文件winapp-1918e0a3这是我的加密功能请告诉我哪里错了

void fencrypt(char* read, char* write, const unsigned char* enc_key) {
RAND_bytes(iv, AES_BLOCK_SIZE);

readFile = fopen(read,"rb");
writeFile = fopen(write,"wb");

fwrite(iv, 1, 8, writeFile);
fwrite("\0\0\0\0\0\0\0\0", 1, 8, writeFile);

AES_set_encrypt_key(enc_key, 256, &key);

init_ctr(&state, iv);
while(1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile); 
    AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

    bytes_written = fwrite(outdata, 1, bytes_read, writeFile); 
    if (bytes_read < AES_BLOCK_SIZE) {
        break;
    }
}

fclose(writeFile);
fclose(readFile);
}
4

2 回答 2

1

我远非 100% 确定,但我有一种感觉,当您在目录中创建新文件时,FindNextFile会感到困惑并再次找到相同的文件名,因为它实际上不是同一个文件。您可能需要收集一个目录中所有文件的列表并一次处理一个,或者保留一个您已经完成的列表并跳过您已经完成的那些。

于 2013-09-10T11:23:23.517 回答
0

FindNextFile调用可能会看到新出现的加密文件,因此您还将继续处理新文件。

由于您在加密文件中附加了“.enc”扩展名,因此跳过已经具有此扩展名的文件会相对简单。

于 2013-09-10T11:24:01.783 回答