Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja DecryptMessage (Schannel) odszyfrowuje komunikat. Niektóre pakiety nie szyfrują i odszyfrowywają komunikatów, ale wykonują i sprawdzają skrót integralności.
Użyj tej funkcji z dostawcą obsługi zabezpieczeń SSP (SSP), aby zasygnalizować żądanie od nadawcy komunikatów na potrzeby ponownego negocjowania (ponownego) atrybutów połączenia lub zamknięcia połączenia.
Uwaga
W tym samym czasie można wywołać metodę EncryptMessage (Schannel) i DecryptMessage (Schannel) z dwóch różnych wątków w kontekście jednego interfejsu dostawcy obsługi zabezpieczeń (SSPI), jeśli jeden wątek jest szyfrujący, a drugi odszyfrowuje. Jeśli więcej niż jeden wątek jest szyfrowane lub więcej niż jeden wątek jest odszyfrowywać, każdy wątek powinien uzyskać unikatowy kontekst.
Składnia
SECURITY_STATUS SEC_Entry DecryptMessage(
_In_ PCtxtHandle phContext,
_Inout_ PSecBufferDesc pMessage,
_In_ ULONG MessageSeqNo,
_Out_ PULONG pfQOP
);
Parametry
phContext [in]
Dojście do kontekstu zabezpieczeń do użycia do odszyfrowywania komunikatu.
pMessage [in, out]
Wskaźnik do struktury SecBufferDesc . W danych wejściowych struktura odwołuje się do co najmniej jednej struktury SecBuffer . Jednym z tych może być typ SECBUFFER_DATA. Ten bufor zawiera zaszyfrowany komunikat. Funkcja odszyfrowuje zaszyfrowany komunikat, zastępując oryginalną zawartość buforu.
Jeśli używasz dostawcy SSP Schannel z kontekstami, które nie są zorientowane na połączenie, struktura musi zawierać cztery struktury SecBuffer na danych wejściowych. Dokładnie jeden bufor musi być typu SECBUFFER_DATA i zawiera zaszyfrowany komunikat, który funkcja odszyfrowuje. Pozostałe są używane na potrzeby danych wyjściowych i muszą być typu SECBUFFER_EMPTY. W przypadku kontekstów zorientowanych na połączenie należy podać bufor typu SECBUFFER_DATA, jak określono dla kontekstów niezwiązanych z połączeniem. Ponadto należy podać drugi bufor typu SECBUFFER_TOKEN zawierający token zabezpieczający.
MessageSeqNo [in]
Numer sekwencji oczekiwany przez aplikację transportu, jeśli istnieje. Jeśli aplikacja transportowa nie obsługuje numerów sekwencji, ustaw ten parametr na zero.
Jeśli używasz dostawcy SSP Schannel, ustaw ten parametr na zero. Dostawca SSP Schannel nie używa numerów sekwencji.
pfQOP [out]
Wskaźnik do zmiennej typu ULONG , która odbiera flagi specyficzne dla pakietu, które wskazują jakość ochrony.
Jeśli używasz dostawcy SSP Schannel, nie używaj tego parametru. Ustaw wartość NULL.
Ten parametr może być następującą flagą.
| Wartość | Znaczenie |
|---|---|
| SECQOP_WRAP_NO_ENCRYPT | Wiadomość nie została zaszyfrowana, ale funkcja wyprodukowała nagłówek lub zwiastun. Nuta: KERB_WRAP_NO_ENCRYPT ma tę samą wartość i to samo znaczenie. |
Wartość zwracana
Jeśli funkcja sprawdza, czy komunikat jest odbierany w prawidłowej sekwencji, zwraca SEC_E_OK.
Jeśli funkcja nie może odszyfrować komunikatu, zwraca jeden z następujących kodów błędów.
| Kod powrotny | Opis |
|---|---|
| SEC_E_INVALID_HANDLE | Parametr phContext określa nieprawidłowy uchwyt kontekstu. Używany z dostawcą SSP Schannel. |
| SEC_E_INVALID_TOKEN | są nieprawidłowego typu lub nie znaleziono buforu typu SECBUFFER_DATA. Używany z dostawcą SSP Schannel. |
| SEC_E_MESSAGE_ALTERED | Wiadomość zostanie zmieniona. Używany z dostawcą SSP Schannel. |
| SEC_E_OUT_OF_SEQUENCE | Komunikat nie jest odbierany w prawidłowej kolejności. |
| SEC_I_CONTEXT_EXPIRED | Nadawca komunikatu kończy korzystanie z połączenia i inicjuje zamknięcie. Aby uzyskać informacje na temat inicjowania lub rozpoznawania zamknięcia, zobacz Zamykanie połączenia Schannel. Używany z dostawcą SSP Schannel. |
| SEC_I_RENEGOTIATE | Strona zdalna wymaga nowej sekwencji uzgadniania lub aplikacja inicjuje zamknięcie. Wróć do pętli negocjacji i wywołaj metodę AcceptSecurityContext (Schannel) lub InitializeSecurityContext (Schannel), przekazując ten sam bufor, który został zmodyfikowany przez DecryptMessage, upewniając się, że typ SecBuffer jest ustawiony na SECBUFFER_TOKEN. |
Uwagi
Czasami aplikacja odczytuje dane ze strony zdalnej, próbuje je odszyfrować przy użyciu funkcji DecryptMessage (Schannel) i wykrywa, że funkcja DecryptMessage (Schannel) powiedzie się, ale wyjściowe są puste. To zachowanie jest normalne, a aplikacje muszą mieć możliwość jej obsługi.
Gdy używasz dostawcy SSP Schannel, funkcja DecryptMessage (Ogólne) zwraca SEC_I_CONTEXT_EXPIRED, gdy nadawca komunikatu zamknie połączenie. Aby uzyskać informacje na temat inicjowania lub rozpoznawania zamknięcia, zobacz Zamykanie połączenia Schannel.
Jeśli używasz protokołu TLS 1.0, może być konieczne wielokrotne wywołanie tej funkcji, dostosowanie buforu wejściowego dla każdego wywołania w celu odszyfrowania całego komunikatu.
Funkcja DecryptMessage (Schannel) zwraca SEC_I_RENEGOTIATE, gdy odbiera komunikat protokołu TLS po uzgadnianiu inny niż dane aplikacji. Gdy funkcja DecryptMessage (Schannel) zwróci SEC_I_RENEGOTIATE, wszelkie dalsze wywołania EncryptMessage() i DecryptMessage() kończą się niepowodzeniem z SEC_E_CONTEXT_EXPIRED. Aplikacja obsługuje tę sytuację, wywołując metodę AcceptSecurityContext (Schannel) ( po stronie serwera) lub InitializeSecurityContext (Schannel) (po stronie klienta) i przekazując ten sam bufor, który został zmodyfikowany przez DecryptMessage, zapewniając, że SecBuffer typ jest ustawiony na SECBUFFER_TOKENwartość . Należy pamiętać, że funkcja DecryptMessage nie zawsze zwraca SECBUFFER_EXTRA bufor, gdy SEC_I_RENEGOTIATE jest zwracany. Gdy to początkowe wywołanie zwróci wartość, kontynuuj tak, jakby aplikacja tworzy nowe połączenie. Następnie aplikacja może kontynuować wywoływanie funkcji EncryptMessage() i DecryptMessage(). Aby uzyskać więcej informacji, zobacz Tworzenie kontekstu zabezpieczeń Schannel.
Wymagania
| Wymaganie | Wartość |
|---|---|
| Minimalny obsługiwany klient | Windows XP [tylko aplikacje klasyczne] |
| Minimalny obsługiwany serwer | Windows Server 2003 [tylko aplikacje klasyczne] |
| Nagłówek | Sspi.h (include Security.h) |
| Biblioteka | Secur32.lib |
| DLL | Secur32.dll |
Treści powiązane
- funkcji SSPI
- EncryptMessage (Schannel)
- SecBuffer