2017-10-06 9 views
0

암호화 한 후 "This is a plaintext"라는 작은 텍스트 파일을 해독 할 수 있습니다. 그러나 더 큰 파일 크기의 암호를 해독하려고하면 NTE_BAD_DATA의 오류가 발생합니다.C++ CryptDecrypt 오류 NTE_BAD_DATA

누구나 잘못 될 수 있음을 지적 할 수 있습니까?

아래는 전체 코드의 추출 된 부분입니다.

#define ENCRYPT_BLOCK_SIZE 256 

dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; 
dwBufferLen = dwBlockLen; 

if (!ReadFile(hSourceFile, pbBuffer, dwBlockLen, &dwCount, NULL)) { 
    handleError("Error reading from source file.\n", GetLastError()); 
    goto Exit_decryptFile; 
} 

if (dwCount <= dwBlockLen) { 
    fEOF = TRUE; 
} 

if (!CryptDecrypt(hKey, 0, fEOF, 0, pbBuffer, &dwCount)) { 
    handleError("Error during CryptDecrypt.\n", GetLastError()); 
    goto Exit_decryptFile; 
} 
+0

'GetLastError'를 너무 늦게 호출하려고합니다. 조건이 성립 된 후 ** 즉시 ** 전화를 걸고 의미있는 값을 반환합니다. – IInspectable

+0

@IInspectable 모든 API 후에 GetLastError를 호출했습니다. 프로그램은 CryptDecrypt에서만 실패합니다. 내가보기에 전체 코드를 업로드해야하나요? – NinjaCow

+0

함수 인수의 평가 순서가 지정되지 않았습니다. 우리는'handleError' 함수 시그니처를 알지 못합니다. 우리가 알고있는 모든 것에서 문자열 리터럴 (예 :'std :: string')에서 임시로 생성 할 수 있으므로'GetLastError'의 결과를 무효화 할 수 있습니다. 우리가 추측하지 말고, [mcve]를 만들어라. – IInspectable

답변

0

왜냐하면 232 바이트를 읽었 기 때문입니다. 텍스트가 작 으면 (232 바이트 이하), 하나의 (최종) 블록을 해독합니다. 텍스트가 충분히 큰 경우 - 블록 및 버퍼의 크기를 해독하면 블록 크기의 배수 여야합니다.

+0

죄송합니다.하지만 코드를 어떻게 변경해야합니까? 나는 dwCount를 896 – NinjaCow

+0

으로 인쇄했습니다. 미안 해요 - 제가 실수를했습니다 ... 768 바이트 ... –

+0

을 읽었지 만, 읽는 바이트와 버퍼 크기를 어떻게 지정합니까? 내가 사용하는 코드는 Microsoft 웹 사이트에서 참조되지만 대신 RSA를 사용합니다. – NinjaCow