DecryptMessage (Schannel) 函式
DecryptMessage (安全通道) 函式會解密訊息。 某些套件不會加密和解密訊息,而是執行並檢查完整性 雜湊。
此函式也會與 Schannel 安全性支援提供者 (SSP) 搭配使用,以向訊息傳送者發出要求,以取得重新交涉 (重做) 或連線關機。
注意
如果一個執行緒正在加密,且另一個執行緒正在解密,則可以同時從單一安全性支援 (提供者介面中的兩個不同執行緒呼叫EncryptMessage (SChannel) 和DecryptMes) sage (安全通道) 。 如果一個以上的執行緒正在加密,或一個以上的執行緒正在解密,則每個執行緒都應該取得唯一的內容。
語法
SECURITY_STATUS SEC_Entry DecryptMessage(
_In_ PCtxtHandle phContext,
_Inout_ PSecBufferDesc pMessage,
_In_ ULONG MessageSeqNo,
_Out_ PULONG pfQOP
);
參數
phCoNtext [in]
要用來解密訊息 之安全性內容的 控制碼。
pMessage [in, out]
SecBufferDesc結構的指標。 在輸入時,結構會參考一或多個 SecBuffer 結構。 其中一個可能是類型為 SECBUFFER_DATA。 該緩衝區包含加密的訊息。 加密的訊息會就地解密,並覆寫其緩衝區的原始內容。
在輸入上使用 Schannel SSP 與非連接導向的內容時,結構必須包含四 個 SecBuffer 結構。 只有一個緩衝區的類型必須是SECBUFFER_DATA,且包含已就地解密的加密訊息。 其餘緩衝區會用於輸出,而且必須是類型SECBUFFER_EMPTY。 針對連接導向的內容,必須提供SECBUFFER_DATA類型緩衝區,如非連接導向內容所述。 此外,也必須提供包含安全性權杖的第二個SECBUFFER_TOKEN類型緩衝區。
MessageSeqNo [in]
傳輸應用程式預期的序號,如果有的話。 如果傳輸應用程式未維護序號,此參數必須設定為零。
使用安全通道 SSP 時,此參數必須設定為零。 安全通道 SSP 不會使用序號。
pfQOP [out]
ULONG類型的變數指標,可接收指出保護品質的套件特定旗標。
使用安全通道 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_EXTRA。 |
備註
有時候應用程式會從遠端合作物件讀取資料、嘗試使用 DecryptMessage (Schannel) 解密它,併發現 DecryptMessage (Schannel) 成功,但輸出緩衝區是空的。 這是正常行為,而且應用程式必須能夠加以處理。
當您使用安全通道 SSP 時,當訊息傳送者關閉連線時, DecryptMessage (General) 函式會傳回SEC_I_CONTEXT_EXPIRED。 如需起始或辨識關機的相關資訊,請參閱 關閉安全通道連線。
如果您使用 TLS 1.0,您可能需要多次呼叫此函式,並調整每個呼叫上的輸入緩衝區,以解密整個訊息。
當收到應用程式資料以外的交握 TLS 通訊協定訊息時, DecryptMessage (安全通道) 函式會傳回SEC_I_RENEGOTIATE。 當 DecryptMessage (安全通道) 函式傳回SEC_I_RENEGOTIATE之後,任何進一步的 EncryptMessage () 和 DecryptMessage () 呼叫都會失敗,並SEC_E_CONTEXT_EXPIRED。 應用程式會呼叫 AcceptSecurityCoNtext (Schannel) (伺服器端) 或 InitializeSecurityCoNtext (Schannel) (用戶端) ,並傳遞 DecryptMessage () 傳回SECBUFFER_EXTRA,來處理這種情況。 在此初始呼叫傳回值之後,請繼續進行,就像您的應用程式正在建立新的連線一樣。 然後,應用程式可以繼續呼叫 EncryptMessage () 和 DecryptMessage () 。 如需詳細資訊,請參閱 建立安全通道安全性內容。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限桌面應用程式] |
標頭 | Sspi.h (包含 Security.h) |
媒體櫃 | Secur32.lib |
DLL | Secur32.dll |