다음을 통해 공유


일반적인 CNG 프로그래밍

CNG API는 특정 공급자가 아닌 필요한 암호화 알고리즘을 지정하여 공급자를 로드할 수 있는 확장 가능한 공급자 모델을 구현합니다. 장점은 알고리즘 공급자를 교체하거나 업그레이드할 수 있으며 새 공급자를 사용하기 위해 코드를 변경할 필요가 없다는 것입니다. 또한 일부 알고리즘이 나중에 안전하지 않은 것으로 확인되면 코드에 영향을 주지 않고 해당 알고리즘의 보다 안전한 버전을 설치할 수 있습니다. 대부분의 CNG API에는 공급자 또는 공급자가 만든 개체가 필요합니다.

암호화 기본 작업에 CNG API를 사용하는 일반적인 단계는 다음과 같습니다.

  1. 알고리즘 공급자 열기
  2. 알고리즘 속성 가져오기 또는 설정
  3. 키 만들기 또는 가져오기
  4. 암호화 작업 수행
  5. 알고리즘 공급자 닫기

자세한 내용은 프로그래밍 예제를 참조하세요.

알고리즘 공급자 열기

BCryptOpenAlgorithmProvider 함수는 BCryptCreateHash 또는 BCryptGenerateKeyPair와 같은 후속 CNG API에서 사용되는 알고리즘 공급자 핸들을 제공합니다.

알고리즘 속성 가져오기 또는 설정

알고리즘 공급자 핸들을 사용하여 키 크기 또는 현재 작업 모드와 같은 알고리즘에 대한 구현 세부 정보를 가져올 수 있습니다. BCryptGetProperty 함수를 사용하여 특정 속성을 가져옵니다.

알고리즘의 속성을 수정할 수도 있습니다. 예를 들어 AES에서 ECB 블록 암호 체인을 사용하려는 경우 AES 알고리즘의 BCRYPT_CHAINING_MODE 속성을 BCRYPT_CHAIN_MODE_ECB 설정합니다. 속성은 각 AES 키를 구성할 필요 없이 이 알고리즘 핸들을 사용하여 만든 모든 AES 키에 할당됩니다. BCryptSetProperty 함수를 사용하여 이러한 속성을 수정합니다.

키 만들기 또는 가져오기

사용하는 알고리즘 유형에 따라 키를 만들거나 로드해야 할 수 있습니다. 예를 들어 BCryptEncrypt 함수는 첫 번째 매개 변수에 대한 키 핸들을 사용합니다. 해당 함수가 AES와 같은 대칭 암호화 알고리즘을 사용하여 데이터를 암호화하려면 먼저 키를 가져와야 합니다. 키를 가져오는 방법은 사용 중인 알고리즘의 유형과 키의 원본에 따라 달라집니다.

BCryptGenerateSymmetricKeyBCryptGenerateKeyPair 함수를 사용하여 임시 키를 만들 수 있습니다. BCryptImportKey 및 BCryptImportKeyPair 함수를 사용하여 메모리 BLOB에서 임시 키를 가져올 수도 있습니다.

지속형 키의 경우 키 스토리지 함수를 사용하여 키 스토리지 공급자를 로드한 다음 키를 만들거나 로드합니다. 컨테이너 이름에 대해 NULL 을 전달하여 이러한 함수를 사용하여 임시 키를 만들거나 로드할 수도 있습니다. 키 스토리지 함수에 대한 자세한 내용은 CNG 키 스토리지 함수를 참조하세요.

암호화 작업 수행

이제 각각 BCryptEncrypt 또는 BCryptDecrypt 함수를 사용하여 데이터 암호화 또는 암호 해독과 같은 암호화 작업을 수행할 준비가 되었습니다.

알고리즘 공급자 닫기

공급자가 더 이상 필요하지 않은 경우 BCryptCloseAlgorithmProvider 함수에 핸들을 전달하여 공급자를 닫아야 합니다. 이렇게 하면 공급자가 해당 알고리즘 공급자 instance 할당된 모든 리소스를 해제합니다. 공급자 핸들이 닫힌 후에는 다시 사용할 수 없습니다.

공급자를 로드하는 것은 비교적 시간이 많이 걸리는 프로세스일 수 있습니다. 따라서 애플리케이션 수명 동안 여러 번 참조할 공급자 핸들을 캐시해야 합니다.

프로그래밍 예제

다음 예제에서는 CNG를 사용하여 특정 암호화 작업을 수행하는 방법을 설명합니다.