다음을 통해 공유


봉투형 데이터 인코딩

봉투형 데이터는 모든 형식의 암호화된 콘텐츠와 하나 이상의 받는 사람을 위한 암호화된 콘텐츠 암호화 세션 키로 구성됩니다. 봉투형 메시지는 메시지의 내용을 비밀로 유지하고 지정된 사람 또는 엔터티만 콘텐츠를 검색할 수 있도록 허용합니다.

CMS(암호화 메시지 구문)를 사용하여 봉투형 메시지를 인코딩할 수 있습니다. CMS는 키 전송, 키 계약 및 이전에 분산된 KEK(키 암호화 키)의 세 가지 키 관리 기술을 지원합니다. 이전에 분산된 대칭 KEK를 메일링 목록 키 배포라고도 합니다.

이러한 세 가지 기술 각각에서 단일 세션 키가 생성되어 봉투 메시지를 암호화합니다. 키 관리 문제는 세션 키가 발신자에 의해 암호화되고 수신자가 암호 해독하는 방식을 다룹니다. 키 관리 기술을 혼합하여 암호화된 단일 메시지를 많은 받는 사람에게 배포할 수 있습니다.

키 전송 키 관리는 의도한 수신기의 공개 키를 사용하여 세션 키를 암호화합니다. 수신기는 암호화에 사용된 공개 키와 연결된 프라이빗 키를 사용하여 세션 키를 암호 해독합니다. 그런 다음, 수신기는 암호 해독된 세션 키를 사용하여 봉투형 데이터의 암호를 해독합니다. 키 전송을 사용하는 경우 수신자는 보낸 사람의 ID에 대한 정보를 확인하지 않습니다.

키 규약 관리에서 임시 Diffie-Hellman 프라이빗 키가 생성되고 세션 키를 암호화하는 데 사용됩니다. 임시 프라이빗 키에 해당하는 공개 키는 메시지의 받는 사람 정보의 일부로 포함됩니다. 수신자는 수신된 임시 키를 사용하여 세션 키의 암호를 해독하고 이 암호 해독된 세션 키를 사용하여 봉투 메시지의 암호를 해독합니다. 수신자의 개인 키와 함께 임시 키 계약을 사용하여 메시지 수신자는 보낸 사람의 ID에 대한 정보를 확인했습니다.

이전에 분산된 대칭 키를 사용하는 키 관리의 경우 각 메시지에는 이전에 분산된 키 암호화 키로 암호화된 콘텐츠 암호화 키가 포함됩니다. 수신기는 이전에 분산된 키 암호화 키를 사용하여 콘텐츠 암호화 키의 암호를 해독한 다음 암호 해독된 콘텐츠 암호화 키를 사용하여 봉투 메시지의 암호를 해독합니다.

봉투형 데이터를 인코딩하기 위한 일반적인 CMS 이벤트 시퀀스는 다음 그림에 나와 있습니다.

봉투형 데이터 인코딩

  • 일반 텍스트 메시지에 대한 포인터가 검색됩니다.
  • 대칭(세션) 키가 생성됩니다.
  • 대칭 키 및 지정된 암호화 알고리즘은 메시지 데이터를 암호화하는 데 사용됩니다.
  • 인증서 저장소가 열립니다.
  • 받는 사람의 인증서가 저장소에서 검색됩니다.
  • 공개 키는 받는 사람의 인증서에서 검색됩니다.
  • 받는 사람의 공개 키를 사용하여 대칭 키가 암호화됩니다.
  • 받는 사람의 인증서에서 받는 사람의 ID가 검색됩니다.
  • 데이터 암호화 알고리즘, 암호화된 데이터, 암호화된 대칭 키 및 받는 사람 정보 구조와 같은 정보가 디지털 봉투 메시지에 포함됩니다.

하위 수준 메시지 함수를 사용하여 방금 나열된 일반적인 작업을 수행하려면 다음 절차를 사용합니다.

봉투 메시지를 인코딩하려면

  1. 콘텐츠를 만들거나 검색합니다.

  2. 암호화 공급자를 가져옵니다.

  3. 받는 사람 인증서를 가져옵니다.

  4. CMSG_ENVELOPED_ENCODE_INFO 구조를 초기화합니다.

  5. CryptMsgCalculateEncodedLength를 호출하여 인코딩된 메시지 BLOB의 크기를 가져옵니다. 메모리를 할당합니다.

  6. CryptMsgOpenToEncode를 호출하여 dwMsgType에 대한 CMSG_ENVELOPED 전달하고 pvMsgEncodeInfo에 대한 CMSG_ENVELOPED_ENCODE_INFO 대한 포인터를 전달합니다. 이 호출의 결과로 열린 메시지에 대한 핸들이 표시됩니다.

  7. CryptMsgUpdate를 호출하여 6단계에서 검색된 핸들과 암호화, 봉투 및 인코딩할 데이터에 대한 포인터를 전달합니다. 이 함수는 인코딩 프로세스를 완료하는 데 필요한 횟수만큼 호출할 수 있습니다.

  8. CryptMsgGetParam을 호출하여 6단계에서 검색된 핸들과 적절한 매개 변수 형식을 전달하여 원하는 인코딩된 데이터에 액세스합니다. 예를 들어 CMSG_CONTENT_PARAM 전달하여 전체 PKCS #7 메시지에 대한 포인터를 가져옵니다.

    이 인코딩의 결과가 봉투 메시지와 같은 다른 인코딩된 메시지의 내부 데이터 로 사용되는 경우 CMSG_BARE_CONTENT_PARAM 매개 변수를 전달해야 합니다. 예제를 보려면 봉투 메시지 인코딩을 위한 대체 코드를 참조하세요.

  9. CryptMsgClose를 호출하여 메시지를 닫습니다.

이 절차의 결과는 암호화된 데이터, 받는 사람의 공개 키로 암호화된 대칭 키 및 받는 사람 정보 데이터 구조를 포함하는 인코딩된 메시지입니다. 암호화된 콘텐츠와 받는 사람에 대한 암호화된 대칭 키의 조합은 해당 받는 사람을 위한 디지털 봉투 입니다. 모든 유형의 콘텐츠는 여러 받는 사람에 대해 봉투에 담을 수 있습니다.

예제 C 프로그램: 봉투에 담기고 서명된 메시지 인코딩