次の方法で共有


署名付きデータのエンコード

署名されたデータ は、任意の種類のコンテンツと、0 個以上の署名者によるコンテンツの暗号化されたメッセージ ハッシュ で構成されます。 結果のハッシュは、署名後に元のメッセージが変更されていないこと、および特定のユーザーまたはエンティティがデータに署名したことを確認できます。

次の図は、署名付きメッセージをエンコードする手順を示しています。 図の次の一覧では、手順について説明します。

メッセージには、複数の署名者、ハッシュ アルゴリズム、証明書が含まれる場合があります。 この図では、証明書、CRL、および CCTL のみが同じプロセスを使用できることを示しています。 これらは、証明書が表示される場所の図に収まります。

署名されたメッセージのエンコード

署名されたデータをエンコードする一般的なプロセスは次のとおりです。

署名されたデータをエンコードするには

  1. データが (必要に応じて) 作成され、そのデータへのポインターが取得されます。
  2. 署名者 の証明書 を含む証明書ストアが開きます。
  3. 証明書の秘密キーが取得されます。 証明書を使用する前に、証明書に設定する必要がある 2 つのプロパティがあります。 1 つは、証明書を特定の CSP に関連付け、その CSP 内で特定の秘密 キー コンテナーに関連付けるために使用されます。 もう 1 つは、ハッシュ操作が呼び出されたときに使用される ハッシュ アルゴリズムを示すために使用されます。 これらは 1 回だけ設定する必要があります。
  4. 証明書の プロパティによってハッシュ アルゴリズムが決まります。
  5. データのハッシュは、ハッシュ関数を介してデータを送信することによって作成されます。
  6. 署名は、証明書の プロパティを使用して取得された秘密キーを使用してハッシュを暗号化することによって作成されます。
  7. 完成した署名済みメッセージには、次のデータが含まれています。
    • 署名する元のデータ
    • ハッシュ アルゴリズム
    • 署名
    • 署名者の識別子 (証明書の発行者とシリアル番号) を含む署名者情報の構造。
    • 署名者の証明書 (省略可能)

この手順は、単純なケースを示しています。 より複雑なケースでは、メッセージに含まれる認証された属性が含まれます。 コンテンツ タイプが BYTE 文字列以外の場合、または任意のデータ型と共に少なくとも 1 つの認証済み属性がある場合は、コンテンツ (データ) タイプとコンテンツのハッシュという 2 つの標準認証属性が必要です。 このような状況では、 CryptoAPI によって、これら 2 つの必須属性が自動的に提供されます。 低レベルメッセージ関数は、認証された属性をハッシュし、秘密キーを使用してハッシュを暗号化し、これを署名として指定します。

次の手順を使用して、一覧表示したタスクを実行するには、低レベルのメッセージ関数を使用します。

署名されたメッセージをエンコードするには

  1. コンテンツを作成または取得します。

  2. 暗号化プロバイダーを取得します。

  3. 署名者証明書を取得します。

  4. CMSG_SIGNER_ENCODE_INFO構造体を初期化します。

  5. CMSG_SIGNED_ENCODE_INFO構造体を初期化します。

  6. CryptMsgCalculateEncodedLength を呼び出して、エンコードされたメッセージ BLOB のサイズを取得します。 メモリを割り当てます。

  7. CryptMsgOpenToEncode を呼び出し、dwMsgType のCMSG_SIGNEDと pvMsgEncodeInfoCMSG_SIGNED_ENCODE_INFOへのポインターを渡して、開かれたメッセージへのハンドルを取得します。

  8. CryptMsgUpdate を呼び出し、手順 7 で取得したハンドルと、署名およびエンコードされるデータへのポインターを渡します。 この関数は、エンコード 処理を完了するために必要な回数だけ呼び出すことができます。

  9. CryptMsgGetParam を呼び出し、手順 7 で取得したハンドルと適切なパラメーター型を渡して、目的のエンコードされたデータにアクセスします。 たとえば、CMSG_CONTENT_PARAM を渡して 、PKCS #7 メッセージ全体へのポインターを取得します。

    このエンコードの結果を、エンベロープ メッセージなどの別のエンコードされたメッセージの 内部データ として使用する場合は、CMSG_BARE_CONTENT_PARAM パラメーターを渡す必要があります。 これを示す例については、「 エンベロープ メッセージをエンコードするための代替コード」を参照してください。

  10. CryptMsgClose を呼び出してメッセージを閉じます。

この手順の結果は、元のデータ、そのデータの暗号化されたハッシュ (署名)、署名者情報を含むエンコードされたメッセージです。 また、目的のエンコードされた BLOB へのポインターもあります。

C コーディングの詳細については、「 サンプル C プログラム: 署名、エンコード、デコード、およびメッセージの検証」を参照してください。