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


Функция EncryptMessage (Schannel)

Функция EncryptMessage (Schannel) шифрует сообщение для предоставления конфиденциальности. EncryptMessage (Schannel) позволяет приложению выбрать один из алгоритмов шифрования , поддерживаемых выбранным механизмом. Функция EncryptMessage (Schannel) использует контекст безопасности , на который ссылается дескриптор контекста. Некоторые пакеты не имеют сообщений, которые необходимо шифровать или расшифровывать, но предоставляют хэш целостности, который можно проверить.

При использовании Schannel SSP эта функция шифрует сообщения с помощью ключа сеанса , согласованного с удаленной стороной, которая получит сообщение. Алгоритм шифрования определяется используемым [набором шифров ](шифр-suites-in-schannel.md).

Примечание.

EncryptMessage (Schannel) и DecryptMessage (Schannel) можно вызывать одновременно из двух разных потоков в одном контексте интерфейса поставщика поддержки безопасности (SSPI), если один поток шифруется, а другой расшифровывается. Если шифрование нескольких потоков или несколько потоков расшифровываются, каждый поток должен получить уникальный контекст.

Синтаксис

SECURITY_STATUS SEC_Entry EncryptMessage(
  _In_    PCtxtHandle    phContext,
  _In_    ULONG          fQOP,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo
);

Параметры

phContext [in]

Дескриптор контекста безопасности , который будет использоваться для шифрования сообщения.

fQOP [in]

Флаги для конкретного пакета, указывающие качество защиты. Пакет безопасности может использовать этот параметр для включения выбора алгоритмов шифрования.

Этот параметр может быть следующим флагом.

Ценность Значение
SECQOP_WRAP_OOB_DATA
Отправьте сообщение об оповещении Schannel. В этом случае параметр pMessage должен содержать стандартный двухбайтовый код события SSL/TLS. Это значение поддерживается только поставщиком Schannel SSP.
Например, начиная с Windows Vista, сообщение "server hello", отправленное сервером во время протокола повторной проверки подлинности, должно быть зашифровано как оповещение TLS.

pMessage [in, out]

Указатель на структуру SecBufferDesc . По входным данным структура ссылается на одну или несколько структур SecBuffer . Одно из них может быть типом SECBUFFER_DATA. Этот буфер содержит сообщение для шифрования. Сообщение шифруется на месте, перезаписав исходное содержимое структуры.

Функция не обрабатывает буферы с помощью атрибута SECBUFFER_READONLY.

Длина структуры SecBuffer , содержащей сообщение, не должна превышать cbMaximumMessage, полученной из функции QueryContextAttributes (Schannel) ( SECPKG_ATTR_STREAM_SIZES).

MessageSeqNo [in]

Порядковый номер, назначенный приложению транспорта для сообщения. Если приложение транспорта не поддерживает порядковые номера, этот параметр должен быть равен нулю.

При использовании Schannel SSP этот параметр должен иметь значение нулю. Schannel SSP не использует порядковые номера.

Возвращаемое значение

Если функция выполнена успешно, функция возвращает SEC_E_OK.

Если функция завершается ошибкой, она возвращает один из следующих кодов ошибок.

Код возврата Описание
SEC_E_BUFFER_TOO_SMALL
Буфер вывода слишком мал. Дополнительные сведения см. в разделе "Примечания".
SEC_E_CONTEXT_EXPIRED
Приложение ссылается на контекст, который уже закрыт. Правильно написанное приложение не должно получать эту ошибку.
SEC_E_CRYPTO_SYSTEM_INVALID
Шифр, выбранный для контекста безопасности, не поддерживается.
SEC_E_INSUFFICIENT_MEMORY
Для выполнения запрошенного действия недостаточно памяти.
SEC_E_INVALID_HANDLE
Недопустимый дескриптор контекста был указан в параметре phContext .
SEC_E_INVALID_TOKEN
Буфер типа SECBUFFER_DATA не найден.
SEC_E_QOP_NOT_SUPPORTED
Ни конфиденциальность, ни целостность не поддерживаются контекстом безопасности.

Замечания

Функция EncryptMessage (Schannel) шифрует сообщение на основе сообщения и ключа сеанса из контекста безопасности.

Если приложение транспорта создало контекст безопасности для поддержки обнаружения последовательности и вызывающий объект предоставляет порядковый номер, функция содержит эти сведения с зашифрованным сообщением. В том числе эта информация защищает от воспроизведения, вставки и подавления сообщений. Пакет безопасности включает порядковый номер, передаваемый из транспортного приложения.

При использовании с Schannel SSP параметр pMessage должен содержать структуру SecBufferDesc со следующими буферами.

Примечание.

Эти буферы должны быть предоставлены в указанном порядке.

Тип буфера Описание
SECBUFFER_STREAM_HEADER Используется внутри системы. Не требуется инициализация.
SECBUFFER_DATA Содержит зашифрованное сообщение с открытым текстом .
SECBUFFER_STREAM_TRAILER Используется внутри системы. Не требуется инициализация.
SECBUFFER_EMPTY Используется внутри системы. Не требуется инициализация. Размер может быть равен нулю.

При использовании Schannel SSP определите максимальный размер каждого буфера, вызвав функцию QueryContextAttributes (Schannel) и указав атрибут SECPKG_ATTR_STREAM_SIZES. Эта функция возвращает SecPkgContext_StreamSizes структуру, элементы которой содержат максимальные размеры для буферов заголовка (cbHeader ), сообщения (член cbMaximumMessage ) и трейлера (член cbTrailer ).

Для оптимальной производительности структуры pMessage должны быть выделены из непрерывной памяти.

Windows XP/2000: Эта функция также называется SealMessage. Теперь приложения должны использовать только EncryptMessage (Schannel).

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows XP [только классические приложения]
Минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
Заголовок Sspi.h (include Security.h)
Библиотека Secur32.lib
DLL Secur32.dll

См. также