署名付きデータのエンコード
署名されたデータ は、任意の種類のコンテンツと、0 個以上の署名者によるコンテンツの暗号化されたメッセージ ハッシュ で構成されます。 結果のハッシュは、署名後に元のメッセージが変更されていないこと、および特定のユーザーまたはエンティティがデータに署名したことを確認できます。
次の図は、署名付きメッセージをエンコードする手順を示しています。 図の次の一覧では、手順について説明します。
メッセージには、複数の署名者、ハッシュ アルゴリズム、証明書が含まれる場合があります。 この図では、証明書、CRL、および CCTL のみが同じプロセスを使用できることを示しています。 これらは、証明書が表示される場所の図に収まります。
署名されたデータをエンコードする一般的なプロセスは次のとおりです。
署名されたデータをエンコードするには
- データが (必要に応じて) 作成され、そのデータへのポインターが取得されます。
- 署名者 の証明書 を含む証明書ストアが開きます。
- 証明書の秘密キーが取得されます。 証明書を使用する前に、証明書に設定する必要がある 2 つのプロパティがあります。 1 つは、証明書を特定の CSP に関連付け、その CSP 内で特定の秘密 キー コンテナーに関連付けるために使用されます。 もう 1 つは、ハッシュ操作が呼び出されたときに使用される ハッシュ アルゴリズムを示すために使用されます。 これらは 1 回だけ設定する必要があります。
- 証明書の プロパティによってハッシュ アルゴリズムが決まります。
- データのハッシュは、ハッシュ関数を介してデータを送信することによって作成されます。
- 署名は、証明書の プロパティを使用して取得された秘密キーを使用してハッシュを暗号化することによって作成されます。
- 完成した署名済みメッセージには、次のデータが含まれています。
- 署名する元のデータ
- ハッシュ アルゴリズム
- 署名
- 署名者の識別子 (証明書の発行者とシリアル番号) を含む署名者情報の構造。
- 署名者の証明書 (省略可能)
この手順は、単純なケースを示しています。 より複雑なケースでは、メッセージに含まれる認証された属性が含まれます。 コンテンツ タイプが BYTE 文字列以外の場合、または任意のデータ型と共に少なくとも 1 つの認証済み属性がある場合は、コンテンツ (データ) タイプとコンテンツのハッシュという 2 つの標準認証属性が必要です。 このような状況では、 CryptoAPI によって、これら 2 つの必須属性が自動的に提供されます。 低レベルメッセージ関数は、認証された属性をハッシュし、秘密キーを使用してハッシュを暗号化し、これを署名として指定します。
次の手順を使用して、一覧表示したタスクを実行するには、低レベルのメッセージ関数を使用します。
署名されたメッセージをエンコードするには
コンテンツを作成または取得します。
暗号化プロバイダーを取得します。
署名者証明書を取得します。
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 プログラム: 署名、エンコード、デコード、およびメッセージの検証」を参照してください。