다음을 통해 공유


해시된 메시지 인코딩 및 디코딩

해시된 데이터는 모든 형식의 콘텐츠와 콘텐츠의 해시 로 구성됩니다. 해시를 만든 이후 메시지 콘텐츠가 수정되지 않은지 확인해야 하는 경우에만 사용할 수 있습니다.

해시된 메시지를 만들 때 여러 해시 알고리즘과 여러 해시가 있을 수 있습니다. 다음 그림에서는 해시된 메시지를 인코딩하는 데 필요한 작업을 보여 줍니다. 이 프로시저는 그림 뒤에 있는 텍스트에 설명되어 있습니다.

해시된 메시지 만들기

해시된 메시지를 만들려면

  1. 해시할 데이터에 대한 포인터를 가져옵니다.
  2. 사용할 해시 알고리즘을 선택합니다.
  3. 해시 알고리즘을 사용하여 해시 함수를 통해 데이터를 배치합니다.
  4. 해시할 원본 데이터, 해시 알고리즘 및 해시를 인코딩된 메시지에 포함합니다.

하위 수준 메시지 함수를 사용하여 방금 설명한 작업을 수행하려면 다음 절차를 사용합니다.

하위 수준 메시지 함수를 사용하여 메시지를 해시하고 인코딩하려면

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

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

  3. CMSG_HASHED_ENCODE_INFO 구조를 초기화합니다.

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

  5. CryptMsgOpenToEncode를 호출하여 dwMsgType 매개 변수에 대한 CMSG_HASHED 전달하고 pvMsgEncodeInfo 매개 변수의 CMSG_HASHED_ENCODE_INFO 대한 포인터를 전달합니다. 이 호출의 결과로 열린 메시지에 대한 핸들을 가져옵니다.

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

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

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

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

이 절차의 결과는 원본 데이터, 해시 알고리즘 및 해당 데이터의 해시 를 포함하는 인코딩된 메시지입니다. 인코딩된 메시지 BLOB 에 대한 포인터는 7단계에서 가져옵니다.

다음 두 절차는 디코딩한 다음 해시된 데이터를 확인합니다.

해시된 데이터를 디코딩하려면

  1. 인코딩된 BLOB에 대한 포인터를 가져옵니다.
  2. CryptMsgOpenToDecode를 호출하여 필요한 인수를 전달합니다.
  3. CryptMsgUpdate를 한 번 호출하여 2단계에서 검색된 핸들과 디코딩할 데이터에 대한 포인터를 전달합니다. 이렇게 하면 메시지 유형에 따라 메시지에 대해 적절한 작업이 수행됩니다.
  4. CryptMsgGetParam을 호출하여 2단계에서 검색된 핸들과 적절한 매개 변수 형식을 전달하여 원하는 디코딩된 데이터에 액세스합니다. 예를 들어 CMSG_CONTENT_PARAM 전달하여 디코딩된 콘텐츠에 대한 포인터를 가져옵니다.

해시를 확인하려면

  1. CryptMsgControl을 호출하여 CMSG_CTRL_VERIFY_HASH 전달하여 해시를 확인합니다.
  2. CryptMsgClose를 호출하여 메시지를 닫습니다.

예제 프로그램은 예제 C 프로그램: 해시된 메시지 인코딩 및 디코딩을 참조하세요.