次の方法で共有


EncryptMessage (Schannel) 関数

EncryptMessage (Schannel) 関数は、プライバシーを提供するためにメッセージを暗号化しますEncryptMessage (Schannel) を使用すると、選択したメカニズムでサポートされている 暗号化アルゴリズム の中からアプリケーションを選択できます。 EncryptMessage (Schannel) 関数は、コンテキスト ハンドルによって参照されるセキュリティ コンテキストを使用します。 一部のパッケージには、暗号化または復号化するメッセージはありませんが、チェックできる整合性 ハッシュ が提供されます。

Schannel SSP を使用する場合、この関数は、メッセージを受信するリモート パーティとネゴシエートされた セッション キー を使用してメッセージを暗号化します。 暗号化アルゴリズムは、使用中の [暗号 スイート](暗号 suites-in-schannel.md) によって決定されます。

EncryptMessage (Schannel)DecryptMessage (Schannel) は、1 つのスレッドが暗号化されていて、もう 1 つのスレッドが暗号化を解除している場合、1 つの セキュリティ サポート プロバイダー インターフェイス (SSPI) コンテキスト内の 2 つの異なるスレッドから同時に呼び出すことができます。 複数のスレッドが暗号化されている場合、または複数のスレッドが復号化している場合、各スレッドは一意のコンテキストを取得する必要があります。

構文

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

パラメーター

phContext [in]

メッセージの暗号化に使用する セキュリティ コンテキスト のハンドル。

fQOP [in]

保護の品質を示すパッケージ固有のフラグ。 セキュリティ パッケージでは、このパラメーターを使用して暗号化アルゴリズムの選択を有効にすることができます。

このパラメーターには、次のフラグを指定できます。

価値 意味
SECQOP_WRAP_OOB_DATA
Schannel アラート メッセージを送信します。 この場合、 pMessage パラメーターには標準の 2 バイト SSL/TLS イベント コードが含まれている必要があります。 この値は、Schannel SSP でのみサポートされます。
たとえば、Windows Vista 以降では、再認証プロトコル中にサーバーから送信された "server hello" メッセージを TLS アラートとして暗号化する必要があります。

pMessage [in, out]

SecBufferDesc 構造体へのポインター。 入力時に、構造体は 1 つ以上 の SecBuffer 構造体を参照します。 そのうちの 1 つはSECBUFFER_DATA型です。 そのバッファーには、暗号化するメッセージが含まれています。 メッセージは所定の場所で暗号化され、構造の元の内容が上書きされます。

この関数は、SECBUFFER_READONLY属性を持つバッファーを処理しません。

メッセージを含む SecBuffer 構造体の長さは、QueryContextAttributes (Schannel) (SECPKG_ATTR_STREAM_SIZES) 関数から取得される cbMaximumMessage を超えてはなりません。

MessageSeqNo [in]

トランスポート アプリケーションがメッセージに割り当てたシーケンス番号。 トランスポート・アプリケーションがシーケンス番号を維持しない場合、このパラメーターはゼロでなければなりません。

Schannel SSP を使用する場合は、このパラメーターを 0 に設定する必要があります。 Schannel SSP はシーケンス番号を使用しません。

戻り値

関数が成功した場合、関数はSEC_E_OKを返します。

関数が失敗すると、次のいずれかのエラー コードが返されます。

リターン コード 説明
SEC_E_BUFFER_TOO_SMALL
出力バッファーが小さすぎます。 詳細については、「解説」を参照してください。
SEC_E_CONTEXT_EXPIRED
アプリケーションは、既に閉じられているコンテキストを参照しています。 適切に記述されたアプリケーションでは、このエラーを受け取るべきではありません。
SEC_E_CRYPTO_SYSTEM_INVALID
セキュリティ コンテキストに対して選択された暗号はサポートされていません。
SEC_E_INSUFFICIENT_MEMORY
要求された操作を完了するために必要なメモリが不足しています。
SEC_E_INVALID_HANDLE
無効なコンテキスト ハンドルが phContext パラメーターで指定されました。
SEC_E_INVALID_TOKEN
SECBUFFER_DATA型バッファーが見つかりませんでした。
SEC_E_QOP_NOT_SUPPORTED
機密性も 整合性、セキュリティ コンテキストではサポートされません。

注釈

EncryptMessage (Schannel) 関数は、セキュリティ コンテキストからのメッセージとセッション キーに基づいてメッセージを暗号化します。

トランスポート アプリケーションがシーケンス検出をサポートする セキュリティ コンテキスト を作成し、呼び出し元がシーケンス番号を提供する場合、関数には暗号化されたメッセージにこの情報が含まれます。 この情報を含めると、メッセージの再生、挿入、抑制から保護されます。 セキュリティ パッケージには、トランスポート アプリケーションから渡されたシーケンス番号が組み込まれています。

Schannel SSP と共に使用する場合、 pMessage パラメーターには、次のバッファーを持つ SecBufferDesc 構造体が含まれている必要があります。

これらのバッファーは、示されている順序で指定する必要があります。

バッファーの種類 説明
SECBUFFER_STREAM_HEADER 内部使用。 初期化は必要ありません。
SECBUFFER_DATA 暗号化する プレーンテキスト メッセージを格納します。
SECBUFFER_STREAM_TRAILER 内部使用。 初期化は必要ありません。
SECBUFFER_EMPTY 内部使用。 初期化は必要ありません。 サイズは 0 にできます。

Schannel SSP を使用する場合は、 QueryContextAttributes (Schannel) 関数を呼び出し、SECPKG_ATTR_STREAM_SIZES属性を指定して、各バッファーの最大サイズを決定します。 この関数はヘッダー (cbHeader メンバー)、メッセージ (cbMaximumMessage メンバー)、およびトレーラー (cbTrailer メンバー) バッファーの最大サイズをメンバーに含むSecPkgContext_StreamSizes構造体返します。

パフォーマンスを最適化するために、 pMessage 構造体を連続するメモリから割り当てる必要があります。

Windows XP/2000: この関数は SealMessage とも呼ばれます。 アプリケーションでは 、EncryptMessage (Schannel) のみを使用する必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされている最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ヘッダ Sspi.h (Security.h を含む)
図書館 Secur32.lib
DLL Secur32.dll

こちらもご覧ください