EternalWindows
CSP / CSPの位置づけ

何らかの強力な暗号化アルゴリズムを実装した場合、 それを自作のアプリケーションに取り入れるだけでなく、 他のアプリケーションからも利用できるようにしたいという要望は多いと思われます。 CSP(Cryptographic Service Provider)とは、 暗号化やハッシュなどのアルゴリズムを実装したDLLであり、 このDLLが実装する関数は、CryptoAPIとよばれるWindowsAPIを通じて 間接的に呼び出すことが可能となっています。 これにより、CSPはCryptoAPIを利用するアプリケーションに対して 暗号化アルゴリズムを提供することが可能となり、 アプリケーションにとってもCryptoAPIを呼び出せば、 暗号化の知識がなくても暗号化を行えるという利点が生じることになります。 次に、CSPのモデル図を示します。

このように、アプリケーションはCryptoAPIを呼び出し、 そのCryptoAPIが選択されているCSPの適切な関数を呼び出すことになります。 ただし、全てのCryptoAPIがCSPへのインターフェースになっているわけではなく、 基本的にはCSPのハンドルを受け取る関数が、CSPの関数を呼び出していると考えるとよいでしょう。 CSPは次に示すレジストリキーに登録されています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider

さて、それではアプリケーションは、 利用するCSPをどのような基準で選択することになるのでしょうか。 たとえば、暗号化アルゴリズムとしてRC4を用いたい場合は、 それをサポートするCSPを選択することになります。 アルゴリズムをサポートするCSPは複数存在することが考えられますが、 どのCSPを選択しても、得られる結果が極端に変化するわけではないことに注意してください。 RC4は1バイト単位で暗号化をするアルゴリズムであり、 これをどのように実装しているかはCSPによって確かに異なります。 したがって、作成された暗号化データもCSPによって異なるわけですが、 アプリケーションが期待するのはあくまで1バイト単位の暗号化であり、 それを満たしているのであれば、どのCSPを利用しても結果は同じように見えることになるでしょう。

CSPの開発について

CSPを開発するとは、CryptoAPIが理解できる関数をDLLに実装し、 それをレジストリに登録することです。 CSPに対してのインターフェースとなるCryptoAPIはadvapi32.dllに実装され、 これらの関数とCSPがエクスポートする関数は一対一の対応を持っています。 たとえば、advapi32.dllのCryptAcquireContextを呼び出した場合、 CSPのCPAcquireContextという関数が呼ばれることになります。 このような、CSPがエクスポートする関数はCryptoSPIと呼ばれ、 その実装はCSP独自の暗号化アルゴリズム等で構成されます。

CSPが正しい動作を行っていることを保障するために、 CSPにはマイクロソフトの署名が入っていなければ利用できないことになっています。 より具体的には、CSPのハンドルを取得するCryptAcquireContextが、 対象となるCSPに署名が入っているかを検証しているのです。 この署名は、ファイルのプロパティから確認することはできませんが、 DLLのリソースにはCRYPT_SIG_RESOURCE_NUMBERという値で識別される署名データが確かに格納されています。 CSPの開発を促進するCSPDKという開発キットは、 いくつかのサンプルプログラムのほか、 CSPに署名を行うためのツールとテスト用のadvapi32.dllが付属しています。 このツールによって署名されたCSPは、正規のadvapi32.dllの検証をパスすることはできませんが、 テスト用のadvapi32.dllでは正しく検証されることになっているため、 CSPをテストする際にはダウンロードすることになるでしょう。 CSPDKがなくてもCSPを作成することはできますが、 CryptoAPIを通じた実践的なテストにはやはりCSPDKが必要です。 一通りのテストが終了すれば、正規の署名を手に入れるべく、 マイクロソフトに問い合わせを行います。



戻る