Поделиться через


Функция 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
Недостаточно памяти для обработки содержимого.

Комментарии

Необходимо вызвать NCryptStreamOpenToProtect или NCryptStreamOpenToUnprotect, чтобы открыть поток перед вызовом NCryptStreamUpdate.

Сообщения могут быть настолько большими, что их одновременное обработка путем сохранения всего сообщения в памяти может оказаться сложной задачей. Однако можно обрабатывать большие сообщения путем секционирования обрабатываемых данных на управляемые блоки.

Для этого используйте 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
Header ncryptprotect.h
Библиотека NCrypt.lib
DLL NCrypt.dll

См. также раздел

Функции DPAPI CNG

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect