다음을 통해 공유


NCryptStreamUpdate 함수(ncryptprotect.h)

NCryptStreamUpdate 함수는 데이터 블록을 암호화하고 암호 해독합니다.

구문

SECURITY_STATUS NCryptStreamUpdate(
  [in] NCRYPT_STREAM_HANDLE hStream,
  [in] const BYTE           *pbData,
       SIZE_T               cbData,
       BOOL                 fFinal
);

매개 변수

[in] hStream

NCryptStreamOpenToProtect 또는 NCryptStreamOpenToUnprotect를 호출하여 만든 스트림 개체에 대한 핸들입니다.

[in] pbData

처리할 바이트 배열에 대한 포인터입니다.

cbData

pbData 매개 변수로 지정된 이진 배열의 바이트 수입니다.

fFinal

마지막 데이터 블록이 처리되었는지 여부를 지정하는 부울 값입니다.

반환 값

함수의 성공 또는 실패를 나타내는 상태 코드를 반환합니다. 가능한 반환 코드에는 다음이 포함되지만 이에 국한되지는 않습니다.

반환 코드 설명
ERROR_SUCCESS
함수가 성공했습니다.
NTE_BAD_DATA
콘텐츠를 디코딩할 수 없습니다.
NTE_INVALID_HANDLE
hStream 매개 변수가 가리키는 스트림 핸들이 잘못되었습니다.
NTE_NO_MEMORY
콘텐츠를 처리하는 데 사용할 수 있는 메모리가 부족했습니다.

설명

NCryptStreamUpdate를 호출하기 전에 NCryptStreamOpenToProtect 또는 NCryptStreamOpenToUnprotect를 호출하여 스트림을 열어야 합니다.

메시지가 너무 커서 전체 메시지를 메모리에 저장하여 한 번에 모두 처리하는 것이 어려울 수 있습니다. 그러나 관리 가능한 블록으로 처리할 데이터를 분할하여 큰 메시지를 처리할 수 있습니다.

이렇게 하려면 블록별로 파일 블록을 통과하는 루프에서 NCryptStreamUpdate 를 사용합니다. 스트리밍된 메시지가 처리되면 지정한 콜백 함수를 사용하여 결과 출력 데이터가 애플리케이션에 다시 전달됩니다. 이 메서드는 다음 예제에 나와 있습니다. 콜백 함수에 대한 자세한 내용은 PFNCryptStreamOutputCallback을 참조하세요.

참고 블록 크기가 너무 작으면 사용하지 않도록 하는 것이 좋습니다. 작은 블록에는 더 많은 호출이 필요하므로 호출 오버헤드가 더 많습니다. 또한 스트리밍 API는 더 큰 블록에 최적화되어 있습니다. 처리해야 하는 데이터에 가장 적합한 블록 크기를 찾기 위해 실험해야 합니다.
 
BOOL                        fFinal = FALSE;
PBYTE                       pbBuf = NULL;

// Determine the number of bytes to read.
DWORD cbData = GetFileSize( hFileIn, NULL );

// Call NCryptStreamUpdate while there is data left to read.
while(FALSE == fFinal)
{
    // Read dwBlockSize bytes from the file.
    if(dwBlockSize > 1)
    {
        if( !ReadFile(hFileIn, pbBuf, dwBlockSize, &cbResult, NULL) )
        {
            hr = HRESULT_FROM_WIN32(hr);            
            goto CleanUp;
        }
    }

    // Decrement the number of bytes to read by the current amount read.
    cbData -= cbResult;

    // Set fFinal if there are no bytes left to read.
    if (cbData <= 0) fFinal = TRUE;

    // Encrypt (or decrypt) the bytes pointed to by pbBuf
    hr = NCryptStreamUpdate(hStream, pbBuf, cbResult, fFinal); 
    if( FAILED(hr) )
    {            
        goto CleanUp;
    }         
}      

CleanUp:
    if( NULL != hStream )
    {
        NCryptStreamClose(hStream);
    }
    if( NULL != hDescriptor )
    {
        NCryptCloseProtectionDescriptor( hDescriptor );
    }
    if(NULL != pbBuf)
    {
        LocalFree(pbBuf);
        pbBuf = NULL;
    }

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2012 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 ncryptprotect.h
라이브러리 NCrypt.lib
DLL NCrypt.dll

추가 정보

CNG DPAPI 함수

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect