ハッシュされたメッセージのエンコードとデコード

ハッシュされたデータは、任意の種類のコンテンツとコンテンツの ハッシュ で構成されます。 ハッシュの作成後にメッセージの内容が変更されていないことを確認する必要がある場合にのみ使用できます。

ハッシュされたメッセージを作成するときに、複数のハッシュ アルゴリズムと複数のハッシュが存在する可能性があります。 次の図は、ハッシュされたメッセージをエンコードするために必要なタスクを示しています。 この手順は、図に続くテキストで説明されています。

ハッシュされたメッセージの作成

ハッシュされたメッセージを作成するには

  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 を呼び出してメッセージを閉じます。

この手順の結果は、元のデータ、ハッシュ アルゴリズム、およびそのデータの ハッシュ を含むエンコードされたメッセージです。 手順 7 では、エンコードされたメッセージ BLOB へのポインターが取得されます。

次の 2 つの手順では、ハッシュされたデータをデコードして検証します。

ハッシュされたデータをデコードするには

  1. エンコードされた BLOB へのポインターを取得します。
  2. CryptMsgOpenToDecode を呼び出し、必要な引数を渡します。
  3. CryptMsgUpdate を 1 回呼び出し、手順 2 で取得したハンドルと、デコードするデータへのポインターを渡します。 これにより、メッセージの種類に応じて、メッセージに対して適切なアクションが実行されます。
  4. CryptMsgGetParam を呼び出し、手順 2 で取得したハンドルと、目的のデコードされたデータにアクセスするための適切なパラメーター型を渡します。 たとえば、CMSG_CONTENT_PARAMを渡して、デコードされたコンテンツへのポインターを取得します。

ハッシュを確認するには

  1. CryptMsgControl を呼び出し、CMSG_CTRL_VERIFY_HASHを渡してハッシュを確認します。
  2. メッセージを閉じるには 、CryptMsgClose を呼び出します。

プログラムの例については、「 サンプル C プログラム: ハッシュされたメッセージのエンコードとデコード」を参照してください。