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


Функция DecryptMessage (General)

Функция DecryptMessage (General) расшифровывает сообщение. Некоторые пакеты не шифруют и не расшифровывают сообщения, а выполняют и проверка хэш целостности.

Поставщик поддержки безопасности дайджеста (SSP) обеспечивает конфиденциальность шифрования и расшифровки для сообщений, передаваемых между клиентом и сервером только в качестве механизма SASL.

Эта функция также используется с поставщиком Schannel SSP, чтобы сообщить о запросе от отправителя сообщения на повторное согласование (повтор) атрибутов подключения или завершение подключения.

Примечание

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

 

Сведения об использовании этой функции с определенным поставщиком общих служб см. в следующих разделах.

Раздел Описание
DecryptMessage (дайджест) Расшифровывает сообщение с помощью дайджеста.
DecryptMessage (Kerberos) Расшифровывает сообщение с помощью Kerberos.
DecryptMessage (Negotiate) Расшифровывает сообщение с помощью negotiate.
DecryptMessage (NTLM) Расшифровывает сообщение с помощью NTLM.
DecryptMessage (Schannel) Расшифровывает сообщение с помощью Schannel.

 

Синтаксис

SECURITY_STATUS SEC_Entry DecryptMessage(
  _In_    PCtxtHandle    phContext,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo,
  _Out_   PULONG         pfQOP
);

Параметры

phContext [in]

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

pMessage [вход, выход]

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

При использовании дайджест-поставщика общих служб для входных данных структура ссылается на одну или несколько структур SecBuffer . Один из них должен иметь тип SECBUFFER_DATA или SECBUFFER_STREAM и содержать зашифрованное сообщение.

При использовании Schannel SSP с контекстами, которые не ориентированы на подключение, для входных данных структура должна содержать четыре структуры SecBuffer . Только один буфер должен иметь тип SECBUFFER_DATA и содержать зашифрованное сообщение, которое расшифровывается на месте. Остальные буферы используются для вывода и должны иметь тип SECBUFFER_EMPTY. Для контекстов, ориентированных на подключение, необходимо предоставить буфер типа SECBUFFER_DATA, как указано для контекстов, не ориентированных на подключение. Кроме того, необходимо указать второй буфер типа SECBUFFER_TOKEN, содержащий маркер безопасности.

MessageSeqNo [in]

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

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

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

pfQOP [out]

Указатель на переменную типа ULONG , которая получает флаги конкретного пакета, указывающие на качество защиты.

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

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

Значение Значение
SECQOP_WRAP_NO_ENCRYPT
Сообщение не было зашифровано, но был создан заголовок или трейлер.
Примечание: KERB_WRAP_NO_ENCRYPT имеет то же значение и одинаковое значение.
SIGN_ONLY
При использовании дайджест-поставщика общих служб используйте этот флаг, если в контексте безопасности задана проверка только сигнатуры . Дополнительные сведения см. в разделе Качество защиты.

 

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

Если функция проверяет, получено ли сообщение в правильной последовательности, функция возвращает SEC_E_OK.

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

Код возврата Описание
SEC_E_BUFFER_TOO_SMALL
Буфер сообщений слишком мал. Используется с поставщиком дайджест-служб.
SEC_E_CRYPTO_SYSTEM_INVALID
Шифр, выбранный для контекста безопасности, не поддерживается. Используется с поставщиком дайджест-служб.
SEC_E_INCOMPLETE_MESSAGE
Данные во входном буфере являются неполными. Приложению необходимо считывать дополнительные данные с сервера и снова вызывать DecryptMessage (Общие).
SEC_E_INVALID_HANDLE
Недопустимый дескриптор контекста был указан в параметре phContext . Используется с дайджест-серверами и Schannel SSP.
SEC_E_INVALID_TOKEN
Буферы имеют неправильный тип или буфер типа SECBUFFER_DATA не найден. Используется с Schannel SSP.
SEC_E_MESSAGE_ALTERED
Сообщение изменено. Используется с дайджест-серверами и Schannel SSP.
SEC_E_OUT_OF_SEQUENCE
Сообщение не было получено в правильной последовательности.
SEC_E_QOP_NOT_SUPPORTED
Контекст безопасности не поддерживает ни конфиденциальность, ни целостность. Используется с поставщиком дайджест-служб.
SEC_I_CONTEXT_EXPIRED
Отправитель сообщения завершил использование подключения и инициировал завершение работы. Сведения об инициации или распознавании завершения работы см. в разделе Завершение работы подключения Schannel. Используется с Schannel SSP.
SEC_I_RENEGOTIATE
Удаленной стороне требуется новая последовательность подтверждения, или приложение только что инициировало завершение работы. Вернитесь в цикл согласования и вызовите AcceptSecurityContext (General) или InitializeSecurityContext (General), передав пустые входные буферы.
Если функция возвращает буфер типа SEC_BUFFER_EXTRA, он должен быть передан в функцию AcceptSecurityContext (General) в качестве входного буфера.
Используется с Schannel SSP.
Повторное согласование не поддерживается для режима ядра Schannel. Вызывающий объект должен либо игнорировать это возвращаемое значение, либо завершить подключение. Если значение игнорируется, клиент или сервер могут завершить подключение.

 

Комментарии

При использовании Schannel SSP функция DecryptMessage (Общие) возвращает SEC_I_CONTEXT_EXPIRED, когда отправитель сообщения завершил подключение. Сведения об инициации или распознавании завершения работы см. в разделе Завершение работы подключения Schannel.

При использовании Schannel SSP DecryptMessage (Общие) возвращает SEC_I_RENEGOTIATE, когда отправителю сообщения требуется повторное согласование подключения (контекст безопасности). Приложение обрабатывает запрошенное повторное согласование, вызывая AcceptSecurityContext (Общее) ( на стороне сервера) или InitializeSecurityContext (Общее) ( на стороне клиента) и передавая пустые входные буферы. После того как этот первоначальный вызов возвращает значение, продолжайте, как если бы приложение создавало новое подключение. Дополнительные сведения см. в разделе [Создание контекста безопасности Schannel](creating-an-schannel-security-context.md).

Сведения о взаимодействии с GSSAPI см. в статье Взаимодействие SSPI/Kerberos с GSSAPI.

Требования

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

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

Функции SSPI

EncryptMessage (общие)

SecBuffer

SecBufferDesc