다음을 통해 공유


DecryptMessage(Schannel) 함수

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 [in]

메시지 암호 해독에 사용할 보안 컨텍스트 에 대한 핸들입니다.

pMessage [in, out]

SecBufferDesc 구조체에 대한 포인터입니다. 입력 시 구조체는 하나 이상의 SecBuffer 구조를 참조합니다. 이러한 버퍼 중 하나는 SECBUFFER_DATA 형식일 수 있습니다. 해당 버퍼에는 암호화된 메시지가 포함됩니다. 이 함수는 암호화된 메시지를 현재 위치에서 해독하여 버퍼의 원래 내용을 덮어씁니다.

연결 지향이 아닌 컨텍스트에서 Schannel SSP를 사용하는 경우 구조체에 입력 시 4개의 SecBuffer 구조체가 포함되어야 합니다. 정확히 하나의 버퍼는 SECBUFFER_DATA 형식이어야 하며 암호화된 메시지를 포함해야 합니다. 이 메시지는 함수가 현재 위치에서 암호를 해독합니다. 나머지 버퍼는 출력에 사용되며 SECBUFFER_EMPTY 형식이어야 합니다. 연결 지향 컨텍스트의 경우 연결 지향이 아닌 컨텍스트에 대해 설명한 대로 SECBUFFER_DATA 형식 버퍼를 제공해야 합니다. 또한 보안 토큰을 포함하는 두 번째 SECBUFFER_TOKEN 형식 버퍼를 제공해야 합니다.

MessageSeqNo [in]

전송 애플리케이션에서 예상하는 시퀀스 번호(있는 경우)입니다. 전송 애플리케이션에서 시퀀스 번호를 유지하지 않는 경우 이 매개 변수를 0으로 설정합니다.

Schannel SSP를 사용하는 경우 이 매개 변수를 0으로 설정합니다. Schannel SSP는 시퀀스 번호를 사용하지 않습니다.

pfQOP [out]

보호 품질을 나타내는 패키지별 플래그를 수신하는 ULONG 형식 변수에 대한 포인터입니다.

Schannel SSP를 사용하는 경우 이 매개 변수를 사용하지 마세요. NULL로 설정합니다.

이 매개 변수는 다음 플래그일 수 있습니다.

가치 의미
SECQOP_WRAP_NO_ENCRYPT 메시지는 암호화되지 않았지만 함수는 헤더 또는 트레일러를 생성했습니다.
메모: KERB_WRAP_NO_ENCRYPT 동일한 값과 동일한 의미를 가합니다.

반환 값

함수가 메시지가 올바른 순서로 수신되었는지 확인하면 SEC_E_OK 반환합니다.

함수가 메시지의 암호를 해독하지 못하면 다음 오류 코드 중 하나를 반환합니다.

반환 코드 설명
SEC_E_INVALID_HANDLE phContext 매개 변수는 잘못된 컨텍스트 핸들을 지정합니다. Schannel SSP와 함께 사용됩니다.
SEC_E_INVALID_TOKEN 버퍼가 잘못된 형식이거나 SECBUFFER_DATA 형식의 버퍼를 찾을 수 없습니다. Schannel SSP와 함께 사용됩니다.
SEC_E_MESSAGE_ALTERED 메시지가 변경되었습니다. Schannel SSP와 함께 사용됩니다.
SEC_E_OUT_OF_SEQUENCE 메시지가 올바른 순서로 수신되지 않습니다.
SEC_I_CONTEXT_EXPIRED 메시지 보낸 사람 연결 사용을 완료 하 고 종료를 시작 합니다. 종료를 시작하거나 인식하는 방법에 대한 자세한 내용은 Schannel 연결종료를 참조하세요. Schannel SSP와 함께 사용됩니다.
SEC_I_RENEGOTIATE 원격 당사자는 새 핸드셰이크 시퀀스가 필요하거나 애플리케이션이 종료를 시작합니다. 협상 루프로 돌아가 서 AcceptSecurityContext(Schannel) 또는 InitializeSecurityContext(Schannel)를 호출하여 DecryptMessage에서 수정한 것과 동일한 버퍼를 전달하여 SecBuffer 형식이 SECBUFFER_TOKEN 설정되었는지 확인합니다.

비고

경우에 따라 애플리케이션은 원격 당사자에서 데이터를 읽고, DecryptMessage(Schannel)를 사용하여 암호를 해독하려고 시도하고, DecryptMessage(Schannel) 가 성공하지만 출력 버퍼가 비어 있음을 검색합니다. 이 동작은 정상이며 애플리케이션에서 처리할 수 있어야 합니다.

Schannel SSP를 사용하면 메시지 발신자가 연결을 종료하면 DecryptMessage(일반) 함수가 SEC_I_CONTEXT_EXPIRED 반환합니다. 종료를 시작하거나 인식하는 방법에 대한 자세한 내용은 Schannel 연결종료를 참조하세요.

TLS 1.0을 사용하는 경우 이 함수를 여러 번 호출하여 각 호출에서 입력 버퍼를 조정하여 전체 메시지의 암호를 해독해야 할 수 있습니다.

DecryptMessage(Schannel) 함수는 애플리케이션 데이터 이외의 사후 핸드셰이크 TLS 프로토콜 메시지를 받으면 SEC_I_RENEGOTIATE 반환합니다. DecryptMessage(Schannel)가 SEC_I_RENEGOTIATE 반환하면 SEC_E_CONTEXT_EXPIRED 추가 EncryptMessage() 및 DecryptMessage() 호출이 실패합니다. 애플리케이션은 AcceptSecurityContext(Schannel)( 서버 쪽) 또는 InitializeSecurityContext(Schannel)( 클라이언트 쪽)를 호출하고 DecryptMessage에서 수정한 것과 동일한 버퍼를 전달하여 형식이 SecBuffer 설정 SECBUFFER_TOKEN되도록 하여 이 상황을 처리합니다. DecryptMessage가 반환되는 경우 SEC_I_RENEGOTIATE 항상 버퍼를 SECBUFFER_EXTRA 반환하지는 않습니다. 이 초기 호출이 값을 반환한 후 애플리케이션이 새 연결을 만드는 것처럼 계속 진행합니다. 그런 다음 애플리케이션은 EncryptMessage() 및 DecryptMessage()를 계속 호출할 수 있습니다. 자세한 내용은 Schannel 보안 컨텍스트 만들기를 참조하세요.

요구 사항

요구 사항 가치
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
헤더 Sspi.h(Security.h 포함)
라이브러리 Secur32.lib
동적 링크 라이브러리 (DLL) Secur32.dll