Important
この記事では、レガシ CryptoAPI を使用した暗号化について説明します。 新しいアプリケーションの場合は、代わりに Cryptography API: Next Generation (CNG) を使用してください。 AES で CNG を使用した最新の暗号化の例については、「 CNG を使用したデータの暗号化」を参照してください。
次の手順では、基本暗号化関数を使用してメッセージを暗号化する手順について説明します。 PKCS #7 標準を使用してメッセージを暗号化するには、「 低レベルメッセージ関数 」および 「簡略化されたメッセージ関数」を参照してください。
メッセージを暗号化するには
CryptGenKey 関数を使用してセッション キーを生成します。
この呼び出しを行うと、ランダム なキーが生成され、ハンドルが返されるため、キーを使用してデータの暗号化と復号化を行うことができます。 この時点で、使用する暗号化アルゴリズムも指定されます。 CryptoAPI では、アプリケーションで公開キー アルゴリズムを使用して一括データを暗号化することは許可されないため、 CryptGenKey 呼び出しで RC2 や RC4 などの対称アルゴリズムを指定します。
または、 CryptDeriveKey 関数を使用して、パスワードを暗号化に適したキーに変換します。
指定したパスワードを持つすべてのユーザーがデータを復号化できるようにアプリケーションでメッセージを暗号化する必要がある場合 は、CryptDeriveKey を使用して、暗号化に適したキーにパスワードを変換します。
Note
この場合、この関数は CryptGenKey 関数の代わりに呼び出され、後続の CryptExportKey 呼び出しは必要ありません。
必要に応じて、 CryptSetKeyParam 関数を使用してキーの追加の暗号化プロパティを設定します
キーが生成されたら、 CryptSetKeyParam関数を使用して、キーの追加の暗号化プロパティを設定できます。 この関数を使用すると、ファイルのさまざまなセクションを異なるキー塩で暗号化でき、キーの暗号モードまたは初期化ベクトルを変更する方法が提供されます。 これらのパラメーターを使用して、暗号化を特定のデータ暗号化標準に準拠させることができます。
CryptEncrypt 関数を使用してファイル内のデータを暗号化します。
CryptEncrypt 関数は、前の手順で生成されたセッション キーを受け取り、データのバッファーを暗号化します。
Note
データが暗号化されると、暗号化アルゴリズムによってデータが少し拡張される可能性があります。 CryptDecrypt 関数に適切な長さを後で指定できるように、アプリケーションは暗号化されたデータの長さを記憶する役割を担います。
必要に応じて、 CryptExportKey 関数を使用して、現在のユーザーが将来データを復号化できるようにします。
現在のユーザーが将来データの暗号化を解除できるようにするには、 CryptExportKey 関数を使用して、ユーザーの秘密キーでのみ復号化できる暗号化された形式 (キー BLOB) で暗号化解除キーを保存します。 この関数には、 CryptGetUserKey 関数を使用して取得できる、この目的のためにユーザーのキー交換公開キーが必要です。 CryptExportKey 関数は、ファイルの暗号化解除に使用するためにアプリケーションで格納する必要があるキー BLOB を返します
Note
アプリケーションに他のユーザーの証明書 (または公開キー) がある場合、他のユーザーがアクセスを受け取る必要がある各ユーザーに 対して CryptExportKey 呼び出しを実行することで、ファイルの暗号化を解除できます。 返されるキー BLOB は、手順 5 のように、アプリケーションによって格納される必要があります。
暗号化されたメッセージの作成
簡略化されたメッセージ関数を使用すると、データの暗号化と復号化が簡単になります。 次の図は、メッセージを暗号化するために実行する必要がある個々のタスクを示しています。 手順については、次の一覧で説明します。
メッセージを暗号化するには
- プレーンテキスト メッセージへのポインターを取得します。
- 対称 (セッション) キーを生成します。
- 対称キーと指定された暗号化アルゴリズムを使用して、メッセージ データを暗号化します。
- 証明書ストアを開きます。
- 受信者の証明書を取得します。
- 受信者の証明書から公開キーを取得します。
- 受信者の公開キーを使用して、対称キーを暗号化します。
- 受信者の証明書から受信者の識別子を取得します。
- デジタルエンベロープ メッセージには、データ暗号化アルゴリズム、暗号化されたデータ、暗号化された対称キー、受信者識別子を含めます。