DecryptMessage (Schannel) 函式會解密訊息。 某些套件不會加密和解密訊息,而是執行和檢查完整性 雜湊。
搭配 Schannel 安全性支援提供者 (SSP) 使用此函式,以發出訊息寄件者重新交涉 (重做) 連線屬性的要求,或關閉連線。
備註
如果一個執行線正在加密,而另一個執行線正在解密,您可以從單一安全性支援提供者介面 (SSPI) 內容中的兩個不同執行程同時呼叫 EncryptMessage (Schannel) 和 DecryptMessage (Schannel) 。 如果一個以上的線程正在加密,或一個以上的線程正在解密,則每個線程都應該取得唯一的內容。
語法
SECURITY_STATUS SEC_Entry DecryptMessage(
_In_ PCtxtHandle phContext,
_Inout_ PSecBufferDesc pMessage,
_In_ ULONG MessageSeqNo,
_Out_ PULONG pfQOP
);
參數
phContext [在]
用來解密訊息的 安全性內容 控制碼。
pMessage [in, out]
SecBufferDesc 結構的指標。 在輸入時,結構會參考一或多個 SecBuffer 結構。 其中一個緩衝區可以是 SECBUFFER_DATA 型別。 該緩衝區包含加密的訊息。 函式會就地解密加密訊息,覆寫其緩衝區的原始內容。
當您將 Schannel SSP 與非連線導向的內容搭配使用時,結構必須在輸入上包含四個 SecBuffer 結構。 只有一個緩衝區必須是 SECBUFFER_DATA 類型,並包含加密訊息,函式會就地解密該訊息。 其餘的緩衝區會用於輸出,且必須是類型SECBUFFER_EMPTY。 對於連線導向環境定義,您必須提供SECBUFFER_DATA型類型緩衝區,如非連線導向環境定義所述。 此外,您必須提供包含安全性權杖的第二個SECBUFFER_TOKEN類型緩衝區。
MessageSeqNo [ in]
傳輸應用程式預期的序號,如果有的話。 如果傳輸應用程式未維護序號,請將此參數設定為零。
當您使用 Schannel SSP 時,請將此參數設定為零。 Schannel SSP 不使用序號。
pfQOP [輸出]
ULONG 類型的變數指標,會接收指出保護品質的套件特定旗標。
當您使用 Schannel SSP 時,請勿使用此參數。 將其設定為 NULL。
此參數可以是下列旗標。
| 價值 | 意義 |
|---|---|
| SECQOP_WRAP_NO_ENCRYPT | 訊息未加密,但函式會產生標頭或預告片。 注意: KERB_WRAP_NO_ENCRYPT具有相同的值和相同的意義。 |
返回值
如果函式驗證是否以正確的順序接收訊息,則會傳回SEC_E_OK。
如果函式無法解密訊息,它會傳回下列其中一個錯誤碼。
| 回傳碼 | 說明 |
|---|---|
| SEC_E_INVALID_HANDLE | phContext 參數指定無效的環境定義控制碼。 與安全通道 SSP 搭配使用。 |
| SEC_E_INVALID_TOKEN | 緩衝區類型錯誤,或找不到類型SECBUFFER_DATA的緩衝區。 與安全通道 SSP 搭配使用。 |
| SEC_E_MESSAGE_ALTERED | 訊息已變更。 與安全通道 SSP 搭配使用。 |
| SEC_E_OUT_OF_SEQUENCE | 未以正確的順序接收訊息。 |
| SEC_I_CONTEXT_EXPIRED | 訊息寄件者完成使用連線並起始關機。 如需起始或辨識關機的相關信息,請參閱 關閉通道連線。 與安全通道 SSP 搭配使用。 |
| SEC_I_RENEGOTIATE | 遠端合作對象需要新的信號交換序列,或應用程式會起始關機。 返回交涉迴圈並呼叫 AcceptSecurityContext (Schannel) 或 InitializeSecurityContext (Schannel) ,傳遞與 DecryptMessage 所修改的相同緩衝區,確保 SecBuffer 類型設定為 SECBUFFER_TOKEN。 |
備註
有時,應用程式會從遠端合作物件讀取數據,嘗試使用 DecryptMessage (Schannel) 來解密數據,並探索 DecryptMessage (Schannel) 成功,但輸出緩衝區是空的。 此行為是正常的,應用程式必須能夠處理它。
當您使用 Schannel SSP 時,當訊息傳送者關閉連線時, DecryptMessage (一般) 函式會傳回SEC_I_CONTEXT_EXPIRED。 如需起始或辨識關機的相關信息,請參閱 關閉通道連線。
如果您使用 TLS 1.0,則可能需要多次呼叫此函式,並在每次呼叫時調整輸入緩衝區,以解密整個訊息。
DecryptMessage (Schannel) 函式在收到應用程式資料以外的握手後 TLS 通訊協定訊息時傳回SEC_I_RENEGOTIATE。 一旦 DecryptMessage (Schannel) 傳回 SEC_I_RENEGOTIATE,任何進一步的 EncryptMessage() 和 DecryptMessage() 呼叫都會失敗,並SEC_E_CONTEXT_EXPIRED。 應用程式會呼叫 AcceptSecurityContext (Schannel) (伺服器端) 或 InitializeSecurityContext (Schannel) (用戶端) ,並傳遞與 DecryptMessage 所修改的相同緩衝區來處理此狀況,確保 SecBuffer 類型設定為 SECBUFFER_TOKEN。 請注意, DecryptMessage 在傳回時不一定會傳回 SECBUFFER_EXTRA 緩衝區 SEC_I_RENEGOTIATE 。 在此初始呼叫傳回值之後,請繼續進行,就像您的應用程式正在建立新的連線一樣。 然後應用程式可以繼續呼叫 EncryptMessage() 和 DecryptMessage()。 如需詳細資訊,請參閱 建立安全通道安全性內容。
需求
| 要求 | 價值 |
|---|---|
| 最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
| 最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
| 頁首 | Sspi.h (包括 Security.h) |
| 圖書館 | Secur32.lib |
| DLL | Secur32.dll |