Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция 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]
Флаги для конкретного пакета, указывающие качество защиты. Пакет безопасности может использовать этот параметр для включения выбора алгоритмов шифрования.
Этот параметр может быть следующим флагом.
| Ценность | Значение |
|---|---|
|
Отправьте сообщение об оповещении 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.
Если функция завершается ошибкой, она возвращает один из следующих кодов ошибок.
| Код возврата | Описание |
|---|---|
|
Буфер вывода слишком мал. Дополнительные сведения см. в разделе "Примечания". |
|
Приложение ссылается на контекст, который уже закрыт. Правильно написанное приложение не должно получать эту ошибку. |
|
Шифр, выбранный для контекста безопасности, не поддерживается. |
|
Для выполнения запрошенного действия недостаточно памяти. |
|
Недопустимый дескриптор контекста был указан в параметре phContext . |
|
Буфер типа SECBUFFER_DATA не найден. |
|
Ни конфиденциальность, ни целостность не поддерживаются контекстом безопасности. |
Замечания
Функция 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 |