Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Funktion DecryptMessage (Schannel) entschlüsselt eine Nachricht. Einige Pakete verschlüsseln und entschlüsseln keine Nachrichten, sondern führen einen Integritätshash aus und überprüfen sie.
Verwenden Sie diese Funktion mit dem Schannel Security Support Provider (SSP), um eine Anforderung eines Nachrichtenabsenders für eine Neuverhandlung (Wiederholen) der Verbindungsattribute oder für ein Herunterfahren der Verbindung zu signalisieren.
Hinweis
Sie können EncryptMessage (Schannel) und DecryptMessage(Schannel) gleichzeitig aus zwei verschiedenen Threads in einem einzigen SSPI-Kontext ( Security Support Provider Interface ) aufrufen, wenn ein Thread verschlüsselt und die andere entschlüsselt wird. Wenn mehr als ein Thread verschlüsselt wird oder mehrere Threads entschlüsselt werden, sollte jeder Thread einen eindeutigen Kontext abrufen.
Syntax
SECURITY_STATUS SEC_Entry DecryptMessage(
_In_ PCtxtHandle phContext,
_Inout_ PSecBufferDesc pMessage,
_In_ ULONG MessageSeqNo,
_Out_ PULONG pfQOP
);
Die Parameter
phContext [in]
Ein Handle für den Sicherheitskontext , der zum Entschlüsseln der Nachricht verwendet werden soll.
pMessage [in, out]
Ein Zeiger auf eine SecBufferDesc-Struktur . Bei der Eingabe verweist die Struktur auf mindestens eine SecBuffer-Struktur . Einer dieser Puffer kann vom Typ SECBUFFER_DATA sein. Dieser Puffer enthält die verschlüsselte Nachricht. Die Funktion entschlüsselt die verschlüsselte Nachricht an Ort und Stelle, wobei der ursprüngliche Inhalt des Puffers überschrieben wird.
Wenn Sie den Schannel-SSP mit Kontexten verwenden, die nicht verbindungsorientiert sind, muss die Struktur vier SecBuffer-Strukturen für eingaben enthalten. Genau ein Puffer muss vom Typ SECBUFFER_DATA sein und eine verschlüsselte Nachricht enthalten, die die Funktion an Ort und Stelle entschlüsselt. Die verbleibenden Puffer werden für die Ausgabe verwendet und müssen vom Typ SECBUFFER_EMPTY sein. Für verbindungsorientierte Kontexte müssen Sie einen SECBUFFER_DATA Typpuffer angeben, wie für nicht verbindungsorientierte Kontexte angegeben. Darüber hinaus müssen Sie einen zweiten SECBUFFER_TOKEN Typpuffer bereitstellen, der ein Sicherheitstoken enthält.
MessageSeqNo [in]
Die Sequenznummer, die von der Transportanwendung erwartet wird, falls vorhanden. Wenn die Transportanwendung keine Sequenznummern verwaltet, legen Sie diesen Parameter auf Null fest.
Wenn Sie den Schannel-SSP verwenden, legen Sie diesen Parameter auf Null fest. Der Schannel-SSP verwendet keine Sequenznummern.
pfQOP [out]
Ein Zeiger auf eine Variable vom Typ ULONG , die paketspezifische Flags empfängt, die die Qualität des Schutzes angeben.
Wenn Sie den Schannel-SSP verwenden, verwenden Sie diesen Parameter nicht. Legen Sie ihn auf NULL fest.
Dieser Parameter kann die folgende Kennzeichnung sein.
| Wert | Bedeutung |
|---|---|
| SECQOP_WRAP_NO_ENCRYPT | Die Nachricht wurde nicht verschlüsselt, aber die Funktion hat eine Kopfzeile oder einen Trailer erstellt. Anmerkung: KERB_WRAP_NO_ENCRYPT hat denselben Wert und dieselbe Bedeutung. |
Rückgabewert
Wenn die Funktion überprüft, ob die Nachricht in der richtigen Reihenfolge empfangen wird, wird SEC_E_OK zurückgegeben.
Wenn die Funktion die Nachricht nicht entschlüsseln kann, wird eine der folgenden Fehlercodes zurückgegeben.
| Rückgabecode | BESCHREIBUNG |
|---|---|
| SEC_E_INVALID_HANDLE | Der phContext-Parameter gibt ein ungültiges Kontexthandle an. Wird mit dem Schannel SSP verwendet. |
| SEC_E_INVALID_TOKEN | Die Puffer weisen den falschen Typ auf, oder es wird kein Puffer des Typs gefunden, SECBUFFER_DATA gefunden wird. Wird mit dem Schannel SSP verwendet. |
| SEC_E_MESSAGE_ALTERED | Die Nachricht wird geändert. Wird mit dem Schannel SSP verwendet. |
| SEC_E_OUT_OF_SEQUENCE | Die Nachricht wird nicht in der richtigen Reihenfolge empfangen. |
| SEC_I_CONTEXT_EXPIRED | Der Absender der Nachricht beendet die Verbindung und initiiert ein Herunterfahren. Informationen zum Initiieren oder Erkennen eines Herunterfahrens finden Sie unter Herunterfahren einer Schannel-Verbindung. Wird mit dem Schannel SSP verwendet. |
| SEC_I_RENEGOTIATE | Die Remoteparty erfordert eine neue Handshakesequenz, oder die Anwendung initiiert ein Herunterfahren. Kehren Sie zur Aushandlungsschleife zurück, und rufen Sie AcceptSecurityContext (Schannel) oder InitializeSecurityContext (Schannel) auf, und übergeben Sie denselben Puffer wie von DecryptMessage geändert, und stellen Sie sicher, dass der SecBuffer-Typ auf SECBUFFER_TOKEN festgelegt ist. |
Bemerkungen
Manchmal liest eine Anwendung Daten von der Remotepartei, versucht, sie mithilfe von DecryptMessage (Schannel) zu entschlüsseln, und ermittelt, dass DecryptMessage (Schannel) erfolgreich ist, aber die Ausgabepuffer sind leer. Dieses Verhalten ist normal, und Anwendungen müssen sie verarbeiten können.
Wenn Sie den Schannel-SSP verwenden, gibt die Funktion DecryptMessage (General) SEC_I_CONTEXT_EXPIRED zurück, wenn der Absender der Nachricht die Verbindung heruntergefahren. Informationen zum Initiieren oder Erkennen eines Herunterfahrens finden Sie unter Herunterfahren einer Schannel-Verbindung.
Wenn Sie TLS 1.0 verwenden, müssen Sie diese Funktion möglicherweise mehrmals aufrufen und den Eingabepuffer für jeden Aufruf anpassen, um eine ganze Nachricht zu entschlüsseln.
Die DecryptMessage (Schannel) -Funktion gibt SEC_I_RENEGOTIATE zurück, wenn sie eine andere TLS-Protokollnachricht nach handshake als Anwendungsdaten empfängt. Sobald DecryptMessage (Schannel) SEC_I_RENEGOTIATE zurückgibt, schlagen alle weiteren EncryptMessage() und DecryptMessage()-Aufrufe mit SEC_E_CONTEXT_EXPIRED fehl. Eine Anwendung behandelt diese Situation durch Aufrufen von AcceptSecurityContext (Schannel) ( Serverseite) oder InitializeSecurityContext (Schannel) ( Clientseite) und Übergeben desselben Puffers wie von DecryptMessage geändert, um sicherzustellen, dass der SecBuffer Typ auf SECBUFFER_TOKEN". Beachten Sie, dass DecryptMessage beim Zurückgeben nicht immer einen SECBUFFER_EXTRA Puffer SEC_I_RENEGOTIATE zurückgibt. Nachdem dieser anfängliche Aufruf einen Wert zurückgegeben hat, fahren Sie fort, als ob ihre Anwendung eine neue Verbindung erstellt. Anschließend kann die Anwendung weiterhin EncryptMessage() und DecryptMessage() aufrufen. Weitere Informationen finden Sie unter Erstellen eines Schannel-Sicherheitskontexts.
Anforderungen
| Anforderung | Wert |
|---|---|
| Mindest unterstützter Client | Windows XP [nur Desktop-Apps] |
| Unterstützter Server (Mindestversion) | Windows Server 2003 [Nur Desktop-Apps] |
| Kopfzeile | Sspi.h (einschließlich Security.h) |
| Bibliothek | Secur32.lib |
| DLL | Secur32.dll |