EternalWindows
CNG / CNGの概要

Windows 95から登場したCryptoAPIは、長きにわたってWindowsにおける暗号化用のAPIとして存在してきました。 このAPIは、CSPというプラグイン可能なDLLを通じて暗号化アルゴリズムを利用し、 アプリケーションから暗号化アルゴリズムの詳細を隠蔽する1つの役割を担っていました。 しかしながら、システム全体を安全に運用させることを考えた場合、 このような暗号化を行うだけの機能では不十分であり、 より充実したセキュリティの基盤が必要です。 こうした理由なども含めて、Windows VistaからはCNG(Cryptography Next Generation)という新しいAPIが登場しました。 CNGでは、先に述べた安全な運用を実現するために、米国政府によって規格された様々な仕様に準拠すると共に、 暗号化に使用する鍵の監査や、カーネルモードにおける暗号化もサポートしています。 また、CNGはCryptoAPIがサポートする全ての暗号化アルゴリズムをサポートするため、 CryptoAPIに代わる暗号化用のAPIとして利用することもできます。

CNGが準拠する政府の規格には、たとえばNSA(国家安全保障局)によって導入されたSuite Bアルゴリズムがあります。 このアルゴリズムには、楕円曲線暗号(ECC)が含まれており、 ECDSAやECDHなどの楕円曲線の性質を利用したアルゴリズムがサポートされています。 また、NIST(国立標準技術研究所)よって規格されたFIPS 140-2は、 スマートカードのようなモジュールに格納する証明書に、 モジュールに関する情報を含めるよう定義しています。 CNGのKSPを独自に開発する場合は、この規格に準拠することが望まれます。 また、システムに存在するデフォルトのKSPは、 セキュリティで保護されたプロセス(鍵分離サービス)で鍵を使用することで、 CC(Common Criteria)の要件を満たしています。

CNGにはCryptoAPIのCSPと同様に、プロバイダという概念があります。 プロバイダとは、実際に暗号化アルゴリズムなどを実装するDLL、またはドライバのことであり、 アプリケーションがCNGの関数を呼び出した場合、 最終的にプロバイダが実装する関数が呼び出されることになっています。 システムに存在するプロバイダは、次のレジストリキーから確認することができます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Providers

レジストリキーの内容は、次のようになっています。

この図では、Microsoft Primitive Providerというプロバイダの情報を確認しています。 1つのプロバイダは、カーネルモードのドライバとして存在することも、 ユーザーモードで動作するDLLとしても存在することができるため、 KM(KernelMode)とUM(UserMode)というように情報が区別されています。 上図では、ユーザーモードの00000001というキーを選択していますが、 この数値はインターフェースの番号です。 インターフェースは、特定の種類のアルゴリズムをグループ化します。 たとえば、CIPHER_INTERFACEは暗号化アルゴリズムをグループ化するため、 RC2やAESなどの暗号化アルゴリズムを含むことができます。 次に、定義されているインターフェースを示します。

インターフェース 内容
CRYPT_CIPHER_INTERFACE RC4やAESなどの対象鍵(セッション鍵)を使った暗号化アルゴリズムを識別する。
CRYPT_HASH_INTERFACE SHA1やMD5などのハッシュをするためのアルゴリズムを識別する。
CRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE RSAなどの非対称鍵(公開鍵/秘密鍵)を使った暗号化アルゴリズムを識別する。
CRYPT_SECRET_AGREEMENT_INTERFACE DHやECDHなどの秘密協定アルゴリズムを識別する。
CRYPT_SIGNATURE_INTERFACE DSAやECDSAなどの署名アルゴリズムを識別する。
CRYPT_RNG_INTERFACE FIPSなどの乱数アルゴリズムを識別する。
CRYPT_KEY_STORAGE_INTERFACE 非対称鍵(公開鍵/秘密鍵)の保存と、それを用いた暗号化や署名を提供する。
CRYPT_SCHANNEL_INTERFACE SSL通信に利用するアルゴリズムを識別する。

たとえば、あるプロバイダがHASH_INTERFACEをサポートするのであれば、 そのプロバイダはMD5などの何らかの署名アルゴリズムを実装しているということになります。 特に、KEY_STORAGE_INTERFACE以外のインターフェースを1つでも実装するプロバイダは、 アルゴリズムプロバイダと呼ばれ、bcrypt.dllからエクスポートされる関数を通じて 実装するアルゴリズムを利用できるようになります。 これらの関数で記述されたコードは、カーネルモードで動作することも可能です。 一方、KEY_STORAGE_INTERFACEをサポートするプロバイダは、 KSP(Key Storage Provider)と呼ばれ、ncrypt.dllからエクスポートされる関数を通じて 鍵の保存などを行うことができます。 本章では、まずアルゴリズムプロバイダの利用から考察します。


戻る