서명된 데이터 인코딩
서명된 데이터는 모든 형식의 콘텐츠와 0명 이상의 서명자가 콘텐츠의 암호화된 메시지 해시 로 구성됩니다. 결과 해시는 서명 이후 원본 메시지가 수정되지 않았으며 특정 사용자 또는 엔터티가 데이터에 서명했는지 확인할 수 있습니다.
다음 그림에서는 서명된 메시지를 인코딩하는 절차를 보여 줍니다. 그림 다음 목록에서는 단계를 설명합니다.
메시지에 여러 서명자, 해시 알고리즘 및 인증서가 있을 수 있습니다. 그림에서는 인증서, CRL 및 CTL 만 보여 주지만 동일한 프로세스를 사용할 수 있습니다. 인증서가 표시되는 곳마다 그림에 적합합니다.
서명된 데이터를 인코딩하는 일반적인 프로세스는 다음과 같습니다.
서명된 데이터를 인코딩하려면
- 데이터가 만들어지고(필요한 경우) 해당 데이터에 대한 포인터가 검색됩니다.
- 서명자의 인증서를 포함하는 인증서 저장소 가 열립니다.
- 인증서의 프라이빗 키가 검색됩니다. 인증서를 사용하기 전에 인증서에 설정해야 하는 두 가지 속성이 있습니다. 인증서를 특정 CSP에 연결하고 해당 CSP 내에서 특정 프라이빗 키 컨테이너에 연결하는 데 사용됩니다. 다른 하나는 해시 작업이 호출될 때 사용할 해시 알고리즘을 나타내는 데 사용됩니다. 이러한 설정은 한 번만 설정하면 됩니다.
- 인증서의 속성은 해시 알고리즘을 결정합니다.
- 해시 함수를 통해 데이터를 전송하여 데이터의 해시를 만듭니다.
- 서명은 인증서의 속성을 통해 얻은 프라이빗 키를 사용하여 해시를 암호화하여 만듭니다.
- 완료된 서명된 메시지에는 다음 데이터가 포함됩니다.
- 서명할 원본 데이터
- 해시 알고리즘
- 서명
- 서명자 식별자(인증서 발급자 및 일련 번호)를 포함하는 서명자 정보 구조
- 서명자의 인증서(선택 사항)
이 절차에서는 간단한 사례를 보여 줍니다. 더 복잡한 사례에는 메시지에 포함된 인증된 특성이 포함됩니다. 콘텐츠 형식이 BYTE 문자열을 제외한 것이거나 데이터 형식과 함께 인증된 특성이 하나 이상 있는 경우 콘텐츠(데이터) 형식과 콘텐츠의 해시라는 두 가지 표준 인증 특성이 필요합니다. 이러한 상황에서 CryptoAPI 는 이러한 두 가지 필수 특성을 자동으로 제공합니다. 하위 수준 메시지 함수는 인증된 특성을 해시하고, 프라이빗 키로 해시를 암호화하고, 이를 서명으로 제공합니다.
하위 수준 메시지 함수를 사용하여 다음 절차를 사용하여 방금 나열된 작업을 수행합니다.
서명된 메시지를 인코딩하려면
콘텐츠를 만들거나 검색합니다.
암호화 공급자를 가져옵니다.
서명자 인증서를 가져옵니다.
CMSG_SIGNER_ENCODE_INFO 구조를 초기화합니다.
CMSG_SIGNED_ENCODE_INFO 구조를 초기화합니다.
CryptMsgCalculateEncodedLength를 호출하여 인코딩된 메시지 BLOB의 크기를 가져옵니다. 메모리를 할당합니다.
CryptMsgOpenToEncode를 호출하여 dwMsgType에 대한 CMSG_SIGNED 전달하고 pvMsgEncodeInfo에 대한 CMSG_SIGNED_ENCODE_INFO 대한 포인터를 전달하여 열린 메시지에 대한 핸들을 가져옵니다.
CryptMsgUpdate를 호출하여 7단계에서 검색된 핸들과 서명 및 인코딩할 데이터에 대한 포인터를 전달합니다. 이 함수는 인코딩 프로세스를 완료하는 데 필요한 만큼 호출할 수 있습니다.
CryptMsgGetParam을 호출하여 7단계에서 검색된 핸들과 적절한 매개 변수 형식을 전달하여 원하는 인코딩된 데이터에 액세스합니다. 예를 들어 CMSG_CONTENT_PARAM 전달하여 전체 PKCS #7 메시지에 대한 포인터를 가져옵니다.
이 인코딩의 결과를 봉투 메시지와 같은 다른 인코딩된 메시지의 내부 데이터 로 사용하려면 CMSG_BARE_CONTENT_PARAM 매개 변수를 전달해야 합니다. 이를 보여 주는 예제는 봉투 메시지 인코딩을 위한 대체 코드를 참조하세요.
CryptMsgClose를 호출하여 메시지를 닫습니다.
이 절차의 결과는 원래 데이터, 해당 데이터의 암호화된 해시(서명자) 및 서명자 정보를 포함하는 인코딩된 메시지입니다. 원하는 인코딩된 BLOB에 대한 포인터도 있습니다.
C 코딩 세부 정보는 예제 C 프로그램: 서명, 인코딩, 디코딩 및 메시지 확인을 참조하세요.