Freigeben über


EncryptMessage (Allgemein)

Die EncryptMessage -Funktion (Allgemein) verschlüsselt eine Nachricht, um Datenschutz bereitzustellen. EncryptMessage (Allgemein) ermöglicht es einer Anwendung, zwischen kryptografischen Algorithmen auszuwählen, die vom ausgewählten Mechanismus unterstützt werden. Die EncryptMessage -Funktion (Allgemein) verwendet den Sicherheitskontext , auf den vom Kontexthandle verwiesen wird. Einige Pakete verfügen nicht über Nachrichten, die verschlüsselt oder entschlüsselt werden sollen, sondern stellen einen Integritätshash bereit, der überprüft werden kann.

Wenn Sie den Digest-Sicherheitsunterstützungsanbieter (Digest Security Support Provider , SSP) verwenden, ist diese Funktion nur als SASL-Mechanismus verfügbar.

Bei Verwendung des Schannel-SSP verschlüsselt diese Funktion Nachrichten mithilfe eines Sitzungsschlüssels , der mit der Remotepartei ausgehandelt wird, die die Nachricht empfängt. Der Verschlüsselungsalgorithmus wird durch die verwendete [Cipher-Suite ](cipher-suites-in-schannel.md) bestimmt.

Hinweis

EncryptMessage (General) und DecryptMessage (General) können gleichzeitig aus zwei verschiedenen Threads in einem einzigen SSPI-Kontext ( Security Support Provider Interface ) aufgerufen werden, 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.

Informationen zur Verwendung dieser Funktion mit einem bestimmten SSP finden Sie in den folgenden Themen.

Thema BESCHREIBUNG
EncryptMessage (Digest) Verschlüsselt eine Nachricht, um mithilfe von Digest Datenschutz bereitzustellen.
EncryptMessage (Kerberos) Verschlüsselt eine Nachricht zum Bereitstellen von Datenschutz mithilfe von Kerberos.
EncryptMessage (Negotiate) Verschlüsselt eine Nachricht zum Bereitstellen von Datenschutz mithilfe von Negotiate.
EncryptMessage (NTLM) Verschlüsselt eine Nachricht, um den Datenschutz mithilfe von NTLM bereitzustellen.
EncryptMessage (Schannel) Verschlüsselt eine Nachricht, um Datenschutz mithilfe von Schannel bereitzustellen.

Syntax

SECURITY_STATUS SEC_Entry EncryptMessage(
  _In_    PCtxtHandle    phContext,
  _In_    ULONG          fQOP,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo
);

Die Parameter

phContext [in]

Ein Handle für den Sicherheitskontext , der zum Verschlüsseln der Nachricht verwendet werden soll.

fQOP [in]

Paketspezifische Flags, die die Qualität des Schutzes angeben. Ein Sicherheitspaket kann diesen Parameter verwenden, um die Auswahl kryptografischer Algorithmen zu ermöglichen.

Bei Verwendung des Digest-SSP muss dieser Parameter auf Null festgelegt werden.

Dieser Parameter kann eine der folgenden Flags sein.

Wert Bedeutung
SECQOP_WRAP_NO_ENCRYPT
Erstellen Sie eine Kopfzeile oder einen Trailer, verschlüsseln Sie die Nachricht jedoch nicht.
Anmerkung: KERB_WRAP_NO_ENCRYPT hat denselben Wert und dieselbe Bedeutung.
SECQOP_WRAP_OOB_DATA
Senden sie eine Schannel-Warnmeldung. In diesem Fall muss der pMessage-Parameter einen Standardmäßigen SSL/TLS-Ereigniscode enthalten. Dieser Wert wird nur vom Schannel-SSP unterstützt.

pMessage [in, out]

Ein Zeiger auf eine SecBufferDesc-Struktur . Bei der Eingabe verweist die Struktur auf mindestens eine SecBuffer-Struktur . Eine dieser Typen kann SECBUFFER_DATA sein. Dieser Puffer enthält die zu verschlüsselnde Nachricht. Die Nachricht ist verschlüsselt und überschreibt den ursprünglichen Inhalt der Struktur.

Die Funktion verarbeitet keine Puffer mit dem attribut SECBUFFER_READONLY.

Die Länge der SecBuffer-Struktur , die die Nachricht enthält, darf nicht größer als cbMaximumMessage sein, die von der QueryContextAttributes (General) (SECPKG_ATTR_STREAM_SIZES)-Funktion abgerufen wird.

Bei Verwendung des Digest-SSP muss ein zweiter Puffer vom Typ SECBUFFER_PADDING oder SEC_BUFFER_DATA vorhanden sein, um Signaturinformationen zu enthalten. Rufen Sie zum Abrufen der Größe des Ausgabepuffers die QueryContextAttributes -Funktion (General) auf, und geben Sie SECPKG_ATTR_SIZES an. Die Funktion gibt eine SecPkgContext_Sizes Struktur zurück. Die Größe des Ausgabepuffers ist die Summe der Werte in den Membern cbMaxSignature und cbBlockSize .

Anwendungen, die SSL nicht verwenden, müssen einen SecBuffer vom Typ SECBUFFER_PADDING bereitstellen.

MessageSeqNo [in]

Die Sequenznummer, die der Transportanwendung der Nachricht zugewiesen wurde. Wenn die Transportanwendung keine Sequenznummern verwaltet, muss dieser Parameter null sein.

Bei Verwendung des Digest-SSP muss dieser Parameter auf Null festgelegt werden. Der Digest-SSP verwaltet die Sequenznummerierung intern.

Bei Verwendung des Schannel-SSP muss dieser Parameter auf Null festgelegt werden. Der Schannel-SSP verwendet keine Sequenznummern.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt die Funktion SEC_E_OK zurück.

Wenn die Funktion fehlschlägt, wird eine der folgenden Fehlercodes zurückgegeben.

Rückgabecode BESCHREIBUNG
SEC_E_BUFFER_TOO_SMALL Der Ausgabepuffer ist zu klein. Weitere Informationen finden Sie in den Hinweisen.
SEC_E_CONTEXT_EXPIRED Die Anwendung verweist auf einen Kontext, der bereits geschlossen wurde. Eine ordnungsgemäß geschriebene Anwendung sollte diesen Fehler nicht erhalten.
SEC_E_CRYPTO_SYSTEM_INVALID Die für den Sicherheitskontext ausgewählte Chiffre wird nicht unterstützt.
SEC_E_INSUFFICIENT_MEMORY Es steht nicht genügend Arbeitsspeicher zur Verfügung, um die angeforderte Aktion abzuschließen.
SEC_E_INVALID_HANDLE Ein ungültiges Kontexthandle wurde im phContext-Parameter angegeben.
SEC_E_INVALID_TOKEN Es wurde kein SECBUFFER_DATA Typpuffer gefunden.
SEC_E_QOP_NOT_SUPPORTED Weder Vertraulichkeit noch Integrität werden vom Sicherheitskontext unterstützt.

Bemerkungen

Die EncryptMessage -Funktion (Allgemein) verschlüsselt eine Nachricht basierend auf der Nachricht und dem Sitzungsschlüssel aus einem Sicherheitskontext.

Wenn die Transportanwendung den Sicherheitskontext zur Unterstützung der Sequenzerkennung erstellt hat und der Aufrufer eine Sequenznummer bereitstellt, enthält die Funktion diese Informationen mit der verschlüsselten Nachricht. Das Einschließen dieser Informationen schützt vor Wiedergabe, Einfügung und Unterdrückung von Nachrichten. Das Sicherheitspaket enthält die Sequenznummer, die von der Transportanwendung übergeben wird.

Wenn Sie den Digest-SSP verwenden, rufen Sie die Größe des Ausgabepuffers ab, indem Sie die QueryContextAttributes (General)- Funktion aufrufen und SECPKG_ATTR_SIZES angeben. Die Funktion gibt eine SecPkgContext_Sizes Struktur zurück. Die Größe des Ausgabepuffers ist die Summe der Werte in den Membern cbMaxSignature und cbBlockSize .

Bei Verwendung mit dem Schannel-SSP muss der pMessage-Parameter eine SecBufferDesc-Struktur mit den folgenden Puffern enthalten.

Hinweis

Diese Puffer müssen in der angezeigten Reihenfolge angegeben werden.

Puffertyp BESCHREIBUNG
SECBUFFER_STREAM_HEADER Intern verwendet. Es ist keine Initialisierung erforderlich.
SECBUFFER_DATA Enthält die unverschlüsselte Nachricht, die verschlüsselt werden soll.
SECBUFFER_STREAM_TRAILER Intern verwendet. Es ist keine Initialisierung erforderlich.
SECBUFFER_EMPTY Intern verwendet. Es ist keine Initialisierung erforderlich. Die Größe kann null sein.

Wenn Sie den Schannel-SSP verwenden, bestimmen Sie die maximale Größe der einzelnen Puffer, indem Sie die QueryContextAttributes (General)- Funktion aufrufen und das attribut SECPKG_ATTR_STREAM_SIZES angeben. Diese Funktion gibt eine SecPkgContext_StreamSizes Struktur zurück, deren Member die maximalen Größen für die Headerpuffer (cbHeader Member), Nachrichten (cbMaximumMessage-Member ) und Trailerpuffer (cbTrailer member) enthalten.

Um eine optimale Leistung zu erzielen, sollten die pMessage-Strukturen aus zusammenhängendem Speicher zugeordnet werden.

Windows XP/2000: Diese Funktion wurde auch als SealMessage bezeichnet. Anwendungen sollten jetzt nur EncryptMessage (Allgemein) verwenden.

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

Siehe auch