1.12 CSP(Cryptographic Service Provider)

 このページでは、WindowsにすでにインストールされているCSPについて説明しています。
 CSPのカスタマイズ方法については、こちらのページで説明しています。
前のページ <<< >>> 次のページ

1.12.1 概要

 CSPは、Windows OSと共にインストールされている暗号化やハッシュ値の計算をするためのソフトウエア エンジンです。ここでは、CSPを利用するための詳細について説明します。
具体的な暗号化の方法は、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を指定し、サイズを求めその後に名称を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。

このアプリケーションを実行した結果(例)は、以下のようになります。
 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については、すでに定義されたシンボルを利用できます。以下に、定義されたシンボルと名称を記します。
定義名称
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のタイプ鍵交換電子署名暗号化ハッシュ計算
PROV_RSA_FULL1RSARSARC2
RC4
MD5
SHA-1
PROV_RSA_AES24RSARSARC2
RC4
AES
MD5
SHA-1
PROV_RSA_SIG2なしRSAなしMD5
SHA-1
PROV_RSA_SCHANNEL12RSARSARC4
DES
Triple DES
MD5
SHA-1
PROV_DSS3なしDSSなしMD5
SHA-1
PROV_DSS_DH13DHDSSCYLINK_MEKMD5
SHA-1
PROV_DH_SCHANNEL18DHDSSDES
Triple DES
MD5
SHA-1
PROV_FORTEZZA4KEADSSSkipjackSHA-1
PROV_MS_EXCHANGE5RSARSACASTMD5
PROV_SSL6RSARSA多数多数

それぞれのアルゴリズムは、以下のとおりです。
アルゴリズム
RSARSA社のアルゴリズム
RC2RC2 ブロックアルゴリズム
RC4RC4 ストリーム アルゴリズム
AESAdvanced Encryption Standard
DESData Encryption Standard
DSSDigital Signature Standard
DHDiffie-Hellman 公開鍵アルゴリズム
CYLINK_MEK40-bit アルゴリズム
KEAKey Exchange Algorithm
SkipjackNational Security Agency(NSA) 80-bit アルゴリズム
CAST64-bit アルゴリズム
MD5MD5 メッセージダイジェスト計算アルゴリズム
SHA-1SHA-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を指定し、サイズを求めその後に名前を求めることになります。詳細については、「関数から戻されるデータの大きさがわからないとき」を参照してください。

このアプリケーションを実行した結果(例)は、以下のようになります。
 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 を説明します。
#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引数には、以下のいずれかを指定します。
          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 であることがわかります。

ご意見・感想などをお聞かせください。こちらから、匿名で送信できます。

(記載の会社名および製品名は、各社の登録商標および商標です。)

PDF-Tools
PDFおよびPDF/Aを作成・編集などができるライブラリ
128ビットの暗号化や電子署名に対応
http:
//www.trustss.co.jp/pdf/
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。
1. 簡単な暗号化
1.1 概要
1.2 キーコンテナー を準備する
1.3 ハッシュ計算のインスタンスを生成する
1.4 ハッシュ値を計算する
1.5 鍵の生成
1.6 暗号化
1.7 復号
1.8 リソースの開放
1.9 サンプル・コード
1.10 ご質問・ご要望
 
1.11 簡単な暗号化アプリを作りたい方のために
 
1.12 CSP
1.12.1 概要
1.12.2 CSPを列挙する
1.12.3 CSPの種類
1.12.4 CSPのタイプ
1.12.5 CSPのタイプを列挙する
1.12.6 規定のCSP
 
1.13 鍵の生成について
1.13.1 概要
1.13.2 鍵の生成
1.13.3 基本データからの鍵生成
1.13.4 基本データ
1.13.5 暗号化データが必ず復号されるために
 
1.14 ブロック暗号化アルゴリズムによる暗号化
1.14.1 概要
1.14.2 キーコンテナー を準備
1.14.3 ハッシュ計算のインスタンス
1.14.4 ハッシュ値を計算
1.14.5 鍵の生成
1.14.6 パディングモードの指定
1.14.7 初期化ベクタ
1.14.8 暗号モードの指定
1.14.9 復号用に鍵オブジェクトを複製
1.14.10 暗号化
1.14.11 復号
1.14.12 リソースの開放
1.14.13 サンプル・コード
1.14.14 ご質問・ご要望
会員用ログイン
ID:
パスワード:
ログインすると、一般公開していないページを閲覧できます。