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


Функция DecryptMessage (General)

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

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

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

Примечание.

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

 

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

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

 

Синтаксис

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

Параметры

phContext [в]

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

pMessage [входящий, исходящий]

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

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

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

MessageSeqNo [в]

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

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

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

pfQOP [выход]

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

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

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

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

 

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

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

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

Код возврата Описание
SEC_E_BUFFER_TOO_SMALL
Буфер сообщения слишком мал. Используется с поставщиком служб дайджеста.
SEC_E_CRYPTO_SYSTEM_INVALID
Шифр, выбранный для контекста безопасности, не поддерживается. Используется с поставщиком служб дайджеста.
SEC_E_INCOMPLETE_MESSAGE
Данные во входном буфере неполны. Приложению необходимо прочитать больше данных с сервера и снова вызвать DecryptMessage (General).
SEC_E_INVALID_HANDLE
Недопустимый дескриптор контекста был указан в параметре phContext . Используется с SCHANNEL И Schannel SSPS.
SEC_E_INVALID_TOKEN
Буферы имеют неправильный тип или не найдены буферы типа SECBUFFER_DATA. Используется с Schannel SSP.
SEC_E_MESSAGE_ALTERED
Сообщение было изменено. Используется с SCHANNEL И Schannel SSPS.
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 (General) возвращает SEC_I_CONTEXT_EXPIRED при завершении подключения отправителем сообщения. Сведения об инициировании или распознавании завершения работы см. в разделе Завершение работыподключения Schannel.

При использовании Schannel SSP decryptMessage (General) возвращает SEC_I_RENEGOTIATE, когда отправитель сообщения хочет повторно обнаставить соединение (контекст безопасности). Приложение обрабатывает запрошенное повторное согласование путем вызова AcceptSecurityContext (General) ( серверной стороны) или InitializeSecurityContext (General) (на стороне клиента) и передачи пустых входных буферов. После этого первоначального вызова возвращается значение, будто приложение создает новое подключение. Дополнительные сведения см. в статье [Создание контекста безопасности 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 (общие)

СекБуфер

SecBufferDesc (СекБуферДеск)