EnvelopedData型とエンコード今回は、データをEnvelopedData型へエンコードする方法について説明します。このエンコードには、CMSG_ENVELOPED_ENCODE_INFO構造体を使用します。*PCMSG_ENVELOPED_ENCODE_INFO;cbSizeは、この構造体のサイズをバイト単位で指定します。hCryptProvは、CSPのハンドルを指定します。0を指定した場合、デフォルトのCSPが使用されます。格納したCRYPT_ALGORITHM_IDENTIFIER構造体のアドレスを指定します。pvEncryptionAuxInfoは、暗号化アルゴリズム固有の構造体を指定します。NULLを指定しても問題ありません。cRecipientsは、rgpRecipientsの要素数を指定します。rgpRecipientsは、受取人の証明書を表すCERT_INFO構造体の配列を指定します。今回は、データをEnvelopedData型へエンコードしてファイルに保存します。受取人の証明書は、前節で作成したsign.datから取得します。TEXT("受取人の証明書の取得に失敗しました。TEXT("暗号化に失敗しました。TEXT("暗号化に成功しました。事前に受取人の証明書と暗号化アルゴリズムを初期化しておかなければなりません。暗号化アルゴリズムはszOID_RSA_RC4としています。これにより、第4引数がCMSG_ENVELOPED_ENCODE_INFO構造体であると解釈されます。CryptMsgGetParamでこれを取得し、ファイルに保存します。CryptMsgControlによるデータの複合化EnvelopedData型のデータを複合化する手順を次に示します。TEXT("受取人のCSP情報の取得に失敗しました。TEXT("複合化に失敗しました。それをCryptMsgUpdateに指定してデコードします。CSPのハンドルと鍵の用途が必要になります。これらを取得するためのGetRecipientCspParamの内部を順に追っていきます。&dwDataSize);CryptMsgGetParamにCMSG_RECIPIENT_INFO_PARAMを指定して、受取人の情報を取得します。複数の受取人が存在する場合を考慮しています。CSPのハンドルと鍵用途は含まれていません。MY証明書ストアにてこれらの情報を持っている証明書を検索すればよいことになります。第1引数に指定した証明書ストアから検索します。CryptAcquireCertificatePrivateKeyでCSPのハンドルと鍵用途を取得することができます。