CryptDeriveKey 함수(wincrypt.h)
이 함수는 생성된 세션 키 임의가 아닌 기본 데이터에서 파생된다는 점을 제외하고 CryptGenKey동일합니다.
CryptDeriveKey 세션 키를 생성하는 데만 사용할 수 있습니다.
세션 키에 대한 핸들은 phKey 매개 변수에 반환됩니다. 이 핸들은 키 핸들이 필요한 CryptoAPI 함수와 함께 사용할 수 있습니다.
통사론
BOOL CryptDeriveKey(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] HCRYPTHASH hBaseData,
[in] DWORD dwFlags,
[in, out] HCRYPTKEY *phKey
);
매개 변수
[in] hProv
CryptAcquireContext호출로 만든 CSP의 HCRYPTPROV 핸들입니다.
[in] Algid
키가 생성될 대칭 암호화 알고리즘을 식별하는 ALG_ID 구조체입니다. 사용 가능한 알고리즘은 CSP마다 다를 가능성이 높습니다. AT_KEYEXCHANGE 및 AT_SIGNATURE 주요 사양에 대해 다른 공급자가 사용하는 알고리즘 식별자에 대한 자세한 내용은 ALG_ID참조하세요.
Microsoft 기본 암호화 공급자와 함께 사용할 ALG_ID 값에 대한 자세한 내용은 기본 공급자 알고리즘참조하세요. Microsoft 강력한 암호화 공급자 또는 Microsoft 고급 암호화 공급자와 함께 사용할 ALG_ID 값에 대한 자세한 내용은 고급 공급자 알고리즘참조하세요.
[in] hBaseData
정확한 기본 데이터를 공급한 해시 개체 대한 핸들입니다.
이 핸들을 가져오려면 애플리케이션은 먼저 CryptCreateHash 사용하여 해시 개체를 만든 다음 CryptHashData사용하여 해시 개체에 기본 데이터를 추가해야 합니다. 이 프로세스는 해시 및 디지털 서명자세히 설명합니다.
[in] dwFlags
생성된 키의 유형을 지정합니다.
세션 키의 크기는 키가 생성될 때 설정할 수 있습니다. 키 모듈러스의 길이를 비트 단위로 나타내는 키 크기는 이 매개 변수의 상위 16비트로 설정됩니다. 따라서 128비트
이 매개 변수의 하위 16비트가 0이거나 비트OR 연산자를 사용하여 다음 플래그 중 하나 이상을 지정할 수 있습니다.
값 | 의미 |
---|---|
|
일반적으로 세션 키가 해시 값으로 만들어지면 남은 비트가 많이 있습니다. 예를 들어 해시 값이 128비트이고 세션 키가 40비트인 경우 88비트가 남습니다.
이 플래그를 설정하면 키에 사용되지 않는 해시 값 비트에 따라 이 플래그를 설정하지 않으면 키에 솔트 값이 0으로 지정됩니다. 0이 아닌 솔트 값을 가진 키를 내보낼 때(CryptExportKey사용하여) 솔트 값을 가져와서 키 BLOB함께 유지해야 합니다. |
|
이 플래그가 설정되면 CryptExportKey 함수를 통해 CSP에서 키 BLOB으로 세션 키를 전송할 수 있습니다. 일반적으로 키를 내보낼 수 있어야 하므로 이 플래그는 일반적으로 설정해야 합니다.
이 플래그를 설정하지 않으면 세션 키를 내보낼 수 없습니다. 즉, 키는 현재 세션 내에서만 사용할 수 있으며 키를 만든 애플리케이션만 사용할 수 있습니다. 이 플래그는 |
|
이 플래그는 40비트 |
|
일부 CSP는 여러 해시 값에서 파생된 세션 키를 사용합니다. 이 경우 CryptDeriveKey 여러 번 호출해야 합니다.
이 플래그를 설정하면 새 세션 키가 생성되지 않습니다. 대신 phKey 지정된 키가 수정됩니다. 이 플래그의 정확한 동작은 생성되는 키의 유형과 사용 중인 특정 CSP에 따라 달라집니다. Microsoft 암호화 서비스 공급자는 이 플래그를 무시합니다. |
|
이 플래그는 Schannel 공급자에서만 사용됩니다. 이 플래그를 설정하면 생성할 키가 서버 쓰기 키입니다. 그렇지 않으면 클라이언트 쓰기 키입니다. |
[in, out] phKey
새로 생성된 키의 핸들 주소를 수신하는 HCRYPTKEY 변수에 대한 포인터입니다. 키 사용을 마쳤으면 CryptDestroyKey 함수를 호출하여 핸들을 해제합니다.
반환 값
함수가 성공하면 함수는 0이 아닌 값(TRUE)을 반환합니다.
함수가 실패하면 0(FALSE)을 반환합니다. 확장 오류 정보는 GetLastError호출합니다.
"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 다음 표에는 몇 가지 가능한 오류 코드가 나열되어 있습니다.
반환 코드 | 묘사 |
---|---|
|
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다. |
|
매개 변수 중 하나에 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다. |
|
Algid 매개 변수는 이 CSP가 지원하지 않는 알고리즘을 지정합니다. |
|
dwFlags 매개 변수에는 유효하지 않은 값이 포함되어 있습니다. |
|
hBaseData 매개 변수에는 해시 개체대한 유효한 핸들이 포함되어 있지 않습니다. |
|
이미 "완료됨"으로 표시된 해시 개체에 데이터를 추가하려고 했습니다. |
|
hProv 매개 변수는 유효한 컨텍스트 핸들을 포함하지 않습니다. |
|
함수가 예기치 않은 방식으로 실패했습니다. |
|
컨텍스트가 자동으로 획득되었기 때문에 공급자가 작업을 수행할 수 없습니다. |
발언
대칭블록 암호화대해 키가 생성되면 기본적으로 초기화 벡터가 0인 CBC(암호화 블록 체인) 모드에서 키가 설정됩니다. 이 암호화 모드 데이터를 대량 암호화하기 위한 좋은 기본 방법을 제공합니다. 이러한 매개 변수를 변경하려면 CryptSetKeyParam 함수를 사용합니다.
CryptDeriveKey 함수는 해시완료합니다. CryptDeriveKey 호출된 후에는 해시에 더 이상 데이터를 추가할 수 없습니다. CryptHashData 또는 CryptHashSessionKey 대한 추가 호출이 실패합니다. 해시를 사용하여 애플리케이션을 완료한 후 CryptDestroyHash 호출하여 해시 개체를 삭제해야 합니다.
적절한 키 길이선택하려면 다음 방법을 사용하는 것이 좋습니다.
- CSP가 지원하는 알고리즘을 열거하고 각 알고리즘의 최대 및 최소 키 길이를 얻으려면 PP_ENUMALGS_EX CryptGetProvParam 호출합니다.
- 최소 및 최대 길이를 사용하여 적절한 키 길이를 선택합니다. 성능 문제가 발생할 수 있으므로 최대 길이를 선택하는 것이 항상 권장되는 것은 아닙니다.
- 원하는 키 길이를 선택한 후 dwFlags 매개 변수의 상위 16비트에서 키 길이를 지정합니다.
- 상수 0x36 64번 반복하여 64비트 버퍼를 형성합니다. k가 입력 매개 변수 hBaseData표시되는 해시 값의 길이가 될 있습니다. 버퍼의 첫 번째 k 바이트를 입력 매개 변수 hBaseData나타내는 해시 값으로 버퍼의 첫 번째 k 바이트의 XOR 작업의 결과로 설정합니다.
- 상수 0x5C 64번 반복하여 64비트 버퍼를 형성합니다. 버퍼의 첫 번째 k 바이트를 입력 매개 변수 hBaseData나타내는 해시 값으로 버퍼의 첫 번째 k 바이트의 XOR 작업의 결과로 설정합니다.
- hBaseData 매개 변수로 표시되는 해시 값을 계산하는 데 사용된 것과 동일한 해시 알고리즘을 사용하여 1단계의 결과를 해시합니다.
- hBaseData 매개 변수로 표시되는 해시 값을 계산하는 데 사용된 것과 동일한 해시 알고리즘을 사용하여 2단계의 결과를 해시합니다.
- 3단계의 결과를 4단계의 결과와 연결합니다.
- 5단계 결과의 첫 번째 n 바이트를 파생 키로 사용합니다.
다음 표에서는 알고리즘 및 공급자별 세션 키에 대한 최소, 기본 및 최대 키 길이를 나열합니다.
공급자 | 알고리즘 | 최소 키 길이 | 기본 키 길이 | 최대 키 길이 |
---|---|---|---|---|
MS Base | RC4 및 RC2 | 40 | 40 | 56 |
MS Base | DES | 56 | 56 | 56 |
MS 고급 | RC4 및 RC2 | 40 | 128 | 128 |
MS 고급 | DES | 56 | 56 | 56 |
MS 고급 | 3DES 112 | 112 | 112 | 112 |
MS 고급 | 3DES | 168 | 168 | 168 |
MS Strong | RC4 및 RC2 | 40 | 128 | 128 |
MS Strong | DES | 56 | 56 | 56 |
MS Strong | 3DES 112 | 112 | 112 | 112 |
MS Strong | 3DES | 168 | 168 | 168 |
DSS/DH Base | RC4 및 RC2 | 40 | 40 | 56 |
DSS/DH Base | Cylink MEK | 40 | 40 | 40 |
DSS/DH Base | DES | 56 | 56 | 56 |
DSS/DH Enh | RC4 및 RC2 | 40 | 128 | 128 |
DSS/DH Enh | Cylink MEK | 40 | 40 | 40 |
DSS/DH Enh | DES | 56 | 56 | 56 |
DSS/DH Enh | 3DES 112 | 112 | 112 | 112 |
DSS/DH Enh | 3DES | 168 | 168 | 168 |
예제
이 함수를 사용하는 예제는 예제 C 프로그램: 암호세션 키 파생을 참조하세요.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | wincrypt.h |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |