CryptDecrypt 함수(wincrypt.h)
S/MIME(Secure/Multipurpose Internet Mail Extensions) 전자 메일 상호 운용성을 지원하기 위한 중요한 변경 사항은 봉투 메시지 처리에 영향을 주는 CryptoAPI에 적용되었습니다. 자세한 내용은 CryptMsgOpenToEncode설명 섹션을 참조하세요.
통사론
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
매개 변수
[in] hKey
암호 해독에 사용할 키에 대한 핸들입니다. 애플리케이션은 CryptGenKey 또는 CryptImportKey 함수를 사용하여 이 핸들을 가져옵니다.
이 키는 사용할 암호 해독 알고리즘을 지정합니다.
[in] hHash
해시 개체대한 핸들입니다. 데이터를 암호 해독하고 동시에 해시하는 경우 해시 개체에 대한 핸들이 이 매개 변수에 전달됩니다. 해시 값은 암호 해독된 일반 텍스트업데이트됩니다. 이 옵션은 서명을 동시에 암호 해독하고 확인할 때 유용합니다.
CryptDecrypt호출하기 전에 애플리케이션은 CryptCreateHash 함수를 호출하여 해시 개체에 대한 핸들을 가져와야 합니다. 암호 해독이 완료되면 CryptGetHashParam 함수를 사용하여 해시 값을 가져오거나, CryptSignHash 함수를 사용하여 서명하거나, CryptVerifySignature 함수를 사용하여 디지털 서명 확인하는 데 사용할 수 있습니다.
해시가 없는 경우 이 매개 변수는 0이어야 합니다.
[in] Final
암호 해독 중인 계열의 마지막 섹션인지 여부를 지정하는 부울 값입니다. 마지막 또는 유일한 블록인 경우 이 값은 TRUE. 마지막 블록이 아닌 경우 이 값은 FALSE
[in] dwFlags
다음 플래그 값이 정의됩니다.
값 | 의미 |
---|---|
|
OAEP(최적 비대칭 암호화 패딩)(PKCS #1 버전 2)를 사용합니다. 이 플래그는 RSA 암호화/암호 해독을 사용하는 microsoft 고급 암호화 공급자 |
|
패딩을 확인하지 않고 BLOB 암호 해독을 수행합니다. 이 플래그는 RSA 암호화/암호 해독을 사용하는 microsoft 고급 암호화 공급자 |
[in, out] pbData
암호 해독할 데이터가 들어 있는 버퍼에 대한 포인터입니다. 암호 해독이 수행된 후 일반 텍스트는 이 동일한 버퍼에 다시 배치됩니다.
이 버퍼의 암호화된 바이트 수는 pdwDataLen
[in, out] pdwDataLen
pbData 버퍼의 길이를 나타내는 DWORD 값에 대한 포인터입니다. 이 함수를 호출하기 전에 호출 애플리케이션은 DWORD 값을 해독할 바이트 수로 설정합니다. 반환 시 DWORD 값에는 해독된 일반 텍스트의 바이트 수가 포함됩니다.
반환 값
함수가 성공하면 함수는 0이 아닌 값(TRUE)을 반환합니다.
함수가 실패하면 0(FALSE)을 반환합니다. 확장 오류 정보는 GetLastError호출합니다.
NTE에 의해 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 몇 가지 가능한 오류 코드는 다음과 같습니다.
값 | 묘사 |
---|---|
|
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다. |
|
매개 변수 중 하나에 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다. |
|
hKey세션 키 이 CSP가 지원하지 않는 알고리즘을 지정합니다. |
|
암호 해독할 데이터가 잘못되었습니다. 예를 들어 블록 암호가 사용되고 |
|
dwFlags 매개 변수가 0이 아닌 경우 |
|
hHash 매개 변수에는 유효하지 않은 핸들이 포함되어 있습니다. |
|
hKey 매개 변수에는 키에 대한 유효한 핸들이 포함되어 있지 않습니다. |
|
출력 버퍼의 크기가 너무 작아서 생성된 일반 텍스트를 보관할 수 없습니다. |
|
키를 만들 때 지정한 CSP 컨텍스트를 찾을 수 없습니다. |
|
애플리케이션은 동일한 데이터의 암호를 두 번 해독하려고 했습니다. |
|
함수가 예기치 않은 방식으로 실패했습니다. |
발언
많은 양의 데이터를 암호 해독하려면 CryptDecrypt 반복적으로 호출하여 섹션에서 수행할 수 있습니다. 암호 해독 엔진이 암호 해독 프로세스를 제대로 완료할 수 있도록
- 키가 블록 암호 키인 경우 데이터는 암호 블록 크기의 배수로 채워집니다. 암호의 블록 크기를 찾으려면 CryptGetKeyParam 사용하여 키의 KP_BLOCKLEN 값을 가져옵니다.
- 암호화가
연결 모드에서 작동하는 경우 다음 CryptDecrypt 작업은 암호의 피드백 레지스터를 키의 KP_IV 값으로 다시 설정합니다. - 암호화가 스트림 암호경우 다음 CryptDecrypt 호출은 암호화를 초기 상태다시 설정합니다.
Final 매개 변수를 TRUE설정하지 않고는 암호의 피드백 레지스터를 키의 KP_IV 값으로 설정할 수 없습니다. 추가 패딩 블록을 추가하거나 각 블록의 크기를 변경하지 않으려는 경우와 같이 필요한 경우 CryptDuplicateKey 함수를 사용하여 원래 키의 중복을 만들고 중복 키를 CryptDecrypt 함수에 전달하여 이를 시뮬레이션할 수 있습니다. 이렇게 하면 원래 키의 KP_IV 중복 키에 배치됩니다. 원래 키를 만들거나 가져온 후에는 키의 피드백 레지스터가 변경되므로 원래 키를 암호화에 사용할 수 없습니다. 다음 의사 코드는 이 작업을 수행하는 방법을 보여 줍니다.
// Set the IV for the original key. Do not use the original key for
// encryption or decryption after doing this because the key's
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)
while(block = NextBlock())
{
// Create a duplicate of the original key. This causes the
// original key's IV to be copied into the duplicate key's
// feedback register.
hDuplicateKey = CryptDuplicateKey(hOriginalKey)
// Decrypt the block with the duplicate key.
CryptDecrypt(hDuplicateKey, block)
// Destroy the duplicate key. Its feedback register has been
// modified by the CryptEncrypt function, so it cannot be used
// again. It will be re-duplicated in the next iteration of the
// loop.
CryptDestroyKey(hDuplicateKey)
}
예제
이 함수를 사용하는 예제는 예제 C 프로그램: 파일암호 해독을 참조하세요.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | wincrypt.h |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |