何をすべきかは、Win32 API で簡単に説明できます。以下のネイティブ API があります。
CryptEnumProviders
、CryptEnumProviderTypes
、CryptGetDefaultProvider
を調べるほど多くのことはありませんHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider
。http://msdn.microsoft.com/en-us/library/aa382359(VS.85).aspxのコード例を参照してください。
すべてのプロバイダーは、いくつかの暗号化アルゴリズムを実装しています。この点CryptGetProvParam
( http://msdn.microsoft.com/en-us/library/aa380196(VS.85).aspxを参照)PP_ENUMALGS
またはPP_ENUMALGS_EX
このアルゴリズムを調べることができます。異なるプロバイダー (DLL) 内に同じアルゴリズムを多数実装できることに混乱することはありません。さまざまなプロバイダーがさまざまな場所 (スマート カードなど) でキーを保持したり、RSA SChannel などの主要な仕事を行ったりすることができますが、他のアルゴリズムが必要であり、実装する必要があります。
すべてのアルゴリズムは、 wincrypt.hALG_ID aiAlgid;
で確認できるように、どこにALG_ID
あるかを識別unsigned int
し、3 つの部分から構成されています。
//
// Algorithm IDs and Flags
//
// ALG_ID crackers
#define GET_ALG_CLASS(x) (x & (7 << 13))
#define GET_ALG_TYPE(x) (x & (15 << 9))
#define GET_ALG_SID(x) (x & (511))
// Algorithm classes
// certenrolld_begin -- ALG_CLASS_*
#define ALG_CLASS_ANY (0)
#define ALG_CLASS_SIGNATURE (1 << 13)
#define ALG_CLASS_MSG_ENCRYPT (2 << 13)
#define ALG_CLASS_DATA_ENCRYPT (3 << 13)
#define ALG_CLASS_HASH (4 << 13)
#define ALG_CLASS_KEY_EXCHANGE (5 << 13)
#define ALG_CLASS_ALL (7 << 13)
// certenrolld_end
// Algorithm types
#define ALG_TYPE_ANY (0)
#define ALG_TYPE_DSS (1 << 9)
#define ALG_TYPE_RSA (2 << 9)
#define ALG_TYPE_BLOCK (3 << 9)
#define ALG_TYPE_STREAM (4 << 9)
#define ALG_TYPE_DH (5 << 9)
#define ALG_TYPE_SECURECHANNEL (6 << 9)
#define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_256)
暗号化アルゴリズムは 1 つだけ含めました。したがって、クラスを持つすべてのアルゴリズムに興味がありますALG_CLASS_DATA_ENCRYPT
。GET_ALG_CLAS()
「ALG_ID クラッカー」から、すべてのアルゴリズムのクラス部分とフィルターALG_CLASS_DATA_ENCRYPT
のみを簡単に見つけることができます。