次の方法で共有


一般的な CNG プログラミング

CNG API は、特定のプロバイダーではなく、必要な暗号化アルゴリズムを指定してプロバイダーを読み込む拡張可能なプロバイダー モデルを実装します。 利点は、アルゴリズム プロバイダーを置き換えたりアップグレードしたりできることです。また、新しいプロバイダーを使用するためにコードを変更する必要はありません。 また、一部のアルゴリズムが将来安全でないと判断された場合は、コードに影響を与えることなく、そのアルゴリズムのより安全なバージョンをインストールできます。 ほとんどの CNG API には、プロバイダーまたはプロバイダーによって作成されたオブジェクトが必要です。

暗号化プリミティブ操作に CNG API を使用する一般的な手順は次のとおりです。

  1. アルゴリズム プロバイダーを開く
  2. アルゴリズムのプロパティの取得または設定
  3. キーの作成またはインポート
  4. 暗号化操作の実行
  5. アルゴリズム プロバイダーを閉じる

詳細については、「プログラミングの例」を参照してください。

アルゴリズム プロバイダーを開く

BCryptOpenAlgorithmProvider 関数は、BCryptCreateHashBCryptGenerateKeyPair などの後続の CNG API で使用されるアルゴリズム プロバイダー ハンドルを提供します。

アルゴリズムのプロパティの取得または設定

アルゴリズム プロバイダー ハンドルを使用して、キー サイズや現在の操作モードなど、アルゴリズムの実装の詳細を取得できます。 特定のプロパティを取得するには 、BCryptGetProperty 関数を使用します。

アルゴリズムのプロパティを変更することもできます。 たとえば、AES で ECB ブロック暗号チェーンを使用する場合は、AES アルゴリズムの BCRYPT_CHAINING_MODE プロパティを BCRYPT_CHAIN_MODE_ECB に設定します。プロパティは、このアルゴリズム ハンドルを使用して作成されたすべての AES キーに割り当てられます。各 AES キーを構成する必要はありません。 BCryptSetProperty 関数を使用して、これらのプロパティを変更します。

キーの作成またはインポート

使用するアルゴリズムの種類によっては、キーを作成または読み込む必要がある場合があります。 たとえば、 BCryptEncrypt 関数は最初のパラメーターのキー ハンドルを受け取ります。 その関数で AES などの対称暗号化アルゴリズムを使用してデータを暗号化する場合は、最初にキーを取得する必要があります。 キーを取得する方法は、使用されているアルゴリズムの種類とキーのソースによって異なります。

エフェメラル キーは 、BCryptGenerateSymmetricKey 関数と BCryptGenerateKeyPair 関数を 使用して作成できます。 BCryptImportKey 関数と BCryptImportKeyPair 関数を使用して、メモリ BLOB からエフェメラル キーをインポートすることもできます。

永続化されたキーの場合は、キー ストレージ関数を使用してキー ストレージ プロバイダーを読み込み、キーを作成または読み込みます。 これらの関数を使用して、コンテナー名に NULL を 渡すことによってエフェメラル キーを作成または読み込むこともできます。 キー ストレージ関数の詳細については、「 CNG キー ストレージ関数」を参照してください。

暗号化操作の実行

これで、 それぞれ BCryptEncrypt 関数または BCryptDecrypt 関数を使用したデータの暗号化や暗号化解除などの暗号化操作を実行する準備ができました。

アルゴリズム プロバイダーを閉じる

プロバイダーが不要になったら、 BCryptCloseAlgorithmProvider 関数にハンドルを渡してプロバイダーを閉じる必要があります。 これにより、プロバイダーは、そのアルゴリズム プロバイダー インスタンスに割り当てられているリソースを解放します。 プロバイダー ハンドルを閉じた後は、再利用できません。

プロバイダーの読み込みは、比較的時間のかかるプロセスになる可能性があります。 そのため、アプリケーションの有効期間中に複数回参照するプロバイダー ハンドルをキャッシュする必要があります。

プログラミングの例

次の例では、CNG を使用して特定の暗号化操作を実行する方法について説明します。