你应该做什么在 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,但是需要和实现一些其他的算法。
每个算法都已经确定ALG_ID aiAlgid;
了 where ALG_ID
isunsigned int
并且由三个部分组成,就像在wincrypt.h中可以看到的那样:
//
// 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)
我只包括了一种加密算法。所以你对类的所有算法都很感兴趣ALG_CLASS_DATA_ENCRYPT
。您可以从“ALG_ID 破解者”中轻松找到GET_ALG_CLAS()
所有算法和过滤器的类部分ALG_CLASS_DATA_ENCRYPT
。