1.12 CSP(Cryptographic Service Provider)
このページでは、WindowsにすでにインストールされているCSPについて説明しています。
CSPのカスタマイズ方法については、こちらのページで説明しています。
CSPのカスタマイズ方法については、こちらのページで説明しています。
1.12.1 概要
CSPは、Windows OSと共にインストールされている暗号化やハッシュ値の計算をするためのソフトウエア エンジンです。ここでは、CSPを利用するための詳細について説明します。
具体的な暗号化の方法は、1.簡単な暗号化を参照してください。
具体的な暗号化の方法は、1.簡単な暗号化を参照してください。
1.12.2 CSP(Cryptographic Service Provider) を列挙する
このコンピュータにインストールされているすべてのCSPを列挙するには、CryptEnumProviders関数を使います。以下にコードを記します。
#include <Windows.h>
#include <WinCrypt.h>
#define BUF_SIZE 100
int main()
{
DWORD cbName = BUF_SIZE;
DWORD dwType;
DWORD dwIndex;
char pszName[BUF_SIZE];
dwIndex = 0;
while(CryptEnumProviders(
dwIndex, // インデックス番号
NULL, // 予約
0, // 予約
&dwType, // CSPのタイプ
pszName, // CSPの名称
&cbName)) // 名称のストリング長
{
printf("2d %s\n", dwType, pszName);
dwIndex++;
cbName = BUF_SIZE;
}
return 0;
}
関数の第1引数には、インデックス番号を指定します。0(ゼロ)から始まる整数を指定します。
第2、第3引数は、将来に予約されていますので、それぞれNULLと0を指定します。
第4引数には、プロバイダーのタイプが戻ります。
第5引数には、プロバイダーの名称(friendly name)が戻ります。
第6引数には、名称を格納するためのバッファのバイト長が戻ります。
一般には、名称のサイズがわかりませんので、第5引数にNULLを指定し、サイズを求めその後に名称を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。
このアプリケーションを実行した結果(例)は、以下のようになります。
第2、第3引数は、将来に予約されていますので、それぞれNULLと0を指定します。
第4引数には、プロバイダーのタイプが戻ります。
第5引数には、プロバイダーの名称(friendly name)が戻ります。
第6引数には、名称を格納するためのバッファのバイト長が戻ります。
一般には、名称のサイズがわかりませんので、第5引数にNULLを指定し、サイズを求めその後に名称を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。
このアプリケーションを実行した結果(例)は、以下のようになります。
1 Gemplus GemSAFE Card CSP v1.0 1 Infineon SICRYPT Base Smart Card CSP 1 Microsoft Base Cryptographic Provider v1.0 13 Microsoft Base DSS and Diffie-Hellman Cryptographic Provider 3 Microsoft Base DSS Cryptographic Provider 1 Microsoft Base Smart Card Crypto Provider 18 Microsoft DH SChannel Cryptographic Provider 1 Microsoft Enhanced Cryptographic Provider v1.0 13 Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider 24 Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype) 5 Microsoft Exchange Cryptographic Provider v1.0 12 Microsoft RSA SChannel Cryptographic Provider 1 Microsoft Strong Cryptographic Provider 1 Schlumberger Cryptographic Service Provider
注意)上記の結果は、コンピュータにインストールされているCSPによって異なります。
1.12.3 CSP(Cryptographic Service Provider) の種類
簡単な暗号化では、上記で列挙したCSPの中から、“Microsoft Base Cryptographic Provider v1.0”を使って暗号化を行いました。
CSPを指定する場合は、この名前を指定しなければなりませんが、規定のCSPについては、すでに定義されたシンボルを利用できます。以下に、定義されたシンボルと名称を記します。
CSPを指定する場合は、この名前を指定しなければなりませんが、規定のCSPについては、すでに定義されたシンボルを利用できます。以下に、定義されたシンボルと名称を記します。
| 定義 | 名称 |
|---|---|
| MS_DEF_PROV | "Microsoft Base Cryptographic Provider v1.0" |
| MS_ENHANCED_PROV | "Microsoft Enhanced Cryptographic Provider v1.0" |
| MS_STRONG_PROV | "Microsoft Strong Cryptographic Provider" |
| MS_DEF_RSA_SIG_PROV | "Microsoft RSA Signature Cryptographic Provider" |
| MS_DEF_RSA_SCHANNEL_PROV | "Microsoft RSA SChannel Cryptographic Provider" |
| MS_DEF_DSS_PROV | "Microsoft Base DSS Cryptographic Provider" |
| MS_DEF_DSS_DH_PROV | "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" |
| MS_ENH_DSS_DH_PROV | "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" |
| MS_DEF_DH_SCHANNEL_PROV | "Microsoft DH SChannel Cryptographic Provider" |
| MS_SCARD_PROV | "Microsoft Base Smart Card Crypto Provider" |
| MS_ENH_RSA_AES_PROV | "Microsoft Enhanced RSA and AES Cryptographic Provider" |
CryptoAPIのバージョンによって利用できるCSPが違う場合がありますので、利用する場合は、十分に確認してください。
1.12.4 CSP(Cryptographic Service Provider) のタイプ
それぞれのCSPは、サポートする暗号化などのあるごろアルゴリズムが決まっています。それぞれのCSPがサポートするタイプを選択しなければなりません。詳細は、使用するCryptoAPIのヘルプを確認してください。
定義されたCSPのタイプを以下に記します。
定義されたCSPのタイプを以下に記します。
| CSPのタイプ | 値 | 鍵交換 | 電子署名 | 暗号化 | ハッシュ計算 |
|---|---|---|---|---|---|
| PROV_RSA_FULL | 1 | RSA | RSA | RC2 RC4 | MD5 SHA-1 |
| PROV_RSA_AES | 24 | RSA | RSA | RC2 RC4 AES | MD5 SHA-1 |
| PROV_RSA_SIG | 2 | なし | RSA | なし | MD5 SHA-1 |
| PROV_RSA_SCHANNEL | 12 | RSA | RSA | RC4 DES Triple DES | MD5 SHA-1 |
| PROV_DSS | 3 | なし | DSS | なし | MD5 SHA-1 |
| PROV_DSS_DH | 13 | DH | DSS | CYLINK_MEK | MD5 SHA-1 |
| PROV_DH_SCHANNEL | 18 | DH | DSS | DES Triple DES | MD5 SHA-1 |
| PROV_FORTEZZA | 4 | KEA | DSS | Skipjack | SHA-1 |
| PROV_MS_EXCHANGE | 5 | RSA | RSA | CAST | MD5 |
| PROV_SSL | 6 | RSA | RSA | 多数 | 多数 |
それぞれのアルゴリズムは、以下のとおりです。
| 名 | アルゴリズム |
|---|---|
| RSA | RSA社のアルゴリズム |
| RC2 | RC2 ブロックアルゴリズム |
| RC4 | RC4 ストリーム アルゴリズム |
| AES | Advanced Encryption Standard |
| DES | Data Encryption Standard |
| DSS | Digital Signature Standard |
| DH | Diffie-Hellman 公開鍵アルゴリズム |
| CYLINK_MEK | 40-bit アルゴリズム |
| KEA | Key Exchange Algorithm |
| Skipjack | National Security Agency(NSA) 80-bit アルゴリズム |
| CAST | 64-bit アルゴリズム |
| MD5 | MD5 メッセージダイジェスト計算アルゴリズム |
| SHA-1 | SHA-1 ハッシュ計算アルゴリズム |
1.12.5 CSP(Cryptographic Service Provider) のタイプを列挙する
このコンピュータで利用できるすべてのCSPのタイプを列挙するには、CryptEnumProviderTypes関数を使います。
#include <Windows.h>
#include <WinCrypt.h>
#define BUF_SIZE 100
int main()
{
DWORD dwIndex;
DWORD dwProvType;
DWORD cbTypeName;
char pszTypeName[BUF_SIZE];
dwIndex = 0;
cbTypeName = BUF_SIZE;
while(CryptEnumProviderTypes(
dwIndex, // インデックス番号
NULL, // 予約
0, // 予約
&dwProvType, // CSPタイプ
pszTypeName, // CSPタイプ名
&cbTypeName)) // サイズ
{
printf("%2d - %s\n", dwProvType, pszTypeName);
dwIndex++;
cbTypeName = BUF_SIZE;
}
return 0;
}
関数の第1引数には、インデックス番号を指定します。0(ゼロ)から始まる番号を指定します。
第2、第3引数は、将来に予約されていますので、それぞれ、NULL,0を指定します。
第4引数には、CSPのタイプ(値)が戻ります。
第5引数には、CSPのタイプ名が戻ります。
第6引数には、名前のサイズが戻ります。
一般には、名前のサイズがわかりませんので、第5引数にNULLを指定し、サイズを求めその後に名前を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。
このアプリケーションを実行した結果(例)は、以下のようになります。
第2、第3引数は、将来に予約されていますので、それぞれ、NULL,0を指定します。
第4引数には、CSPのタイプ(値)が戻ります。
第5引数には、CSPのタイプ名が戻ります。
第6引数には、名前のサイズが戻ります。
一般には、名前のサイズがわかりませんので、第5引数にNULLを指定し、サイズを求めその後に名前を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。
このアプリケーションを実行した結果(例)は、以下のようになります。
1 - RSA Full (Signature and Key Exchange) 3 - DSS Signature 5 - Microsoft Office Outlook/Exchange Cryptographic Service Provider 12 - RSA SChannel 13 - DSS Signature with Diffie-Hellman Key Exchange 18 - Diffie-Hellman SChannel 24 - RSA Full and AES
1.12.6 規定のCSP(Cryptographic Service Provider)
CPSを指定する際には、具体的な名称で指定するだけでなく、規定のCSPを指定することができます。(「2.3.1 CSPのハンドルを取得する」を参照してください。)
この場合に、指定したCSPの名称とタイプを取得するための関数CryptGetDefaultProvider を説明します。
この場合に、指定したCSPの名称とタイプを取得するための関数CryptGetDefaultProvider を説明します。
#include <Windows.h>
#include <WinCrypt.h>
#define BUF_SIZE 100
int main()
{
DWORD cbProvName = BUF_SIZE;
char pszProvName[BUF_SIZE];
CryptGetDefaultProvider(
PROV_RSA_FULL,
NULL,
CRYPT_MACHINE_DEFAULT,
pszProvName,
&cbProvName);
printf("CSP is \"%s\"\n", pszProvName);
return 0;
}
関数の第1引数には、CSPのタイプを指定します。
第2引数は、将来に予約されていますので、NULLを指定します。
第3引数には、以下のいずれかを指定します。
第5引数には、名称のバイトサイズが戻ります。
他の関数と同様に、戻り値のバイトサイズがわからない場合は、第4引数にNULLをしています。詳細は、関数から戻されるデータの大きさがわからないとき を参照してください。
上記の結果(例)を以下に記します。
第2引数は、将来に予約されていますので、NULLを指定します。
第3引数には、以下のいずれかを指定します。
CRYPT_MACHINE_DEFAULT (コンピュータの規定のCSPが戻る)
CRYPT_USER_DEFAULT (ログインユーザの規定のCSPが戻る)
第4引数には、CSPの名称が戻ります。第5引数には、名称のバイトサイズが戻ります。
他の関数と同様に、戻り値のバイトサイズがわからない場合は、第4引数にNULLをしています。詳細は、関数から戻されるデータの大きさがわからないとき を参照してください。
上記の結果(例)を以下に記します。
CSP is "Microsoft Strong Cryptographic Provider"このコンピュータの場合は、PROV_RSA_FULLの規定のCSPは、MS_STRONG_PROV であることがわかります。
ご意見・感想などをお聞かせください。こちらから、匿名で送信できます。
(記載の会社名および製品名は、各社の登録商標および商標です。)