0

我有一个快速的小应用程序,它逐步介绍了可能的对称加密方法。我用以下行得到它们:

 private static List<Type> GetAlgorithmTypes
    {
        get { return Assembly.GetAssembly(typeof(SymmetricAlgorithm)).GetTypes().Where( type => type.IsSubclassOf(typeof(SymmetricAlgorithm))).ToList(); }
    }

正如你在运行它时所看到的,AesCryptoServiceProvider 不是该组的成员,即使它继承自 AES,它确实属于 SymmetricAlgorithm 并显示在我的列表中。这不是什么大问题,如果我也有,我可以手动将提供者添加到组中,但是如果我尝试通过其名称检索此类型:

Type t = Type.GetType("System.Security.Cryptography.AesCryptoServiceProvider");

我为 AesCryptoServiceProvider 获得了一个空对象,但对于组中的任何其他项目都没有。

这真的很奇怪,我想知道是否有人有任何想法。因此,这有点让我需要使用 TripleDES(因为我的机器都在运行 FIPS 合规性要求)。

谢谢你的帮助!

4

4 回答 4

2

SymmetricAlgorithm 位于 mscorlib.dll 中,AesCryptoServiceProvider 位于 System.Core.dll

通过获取基于 SymmetricAlgorithm 类型的程序集,您将获得不包含 AesCryptoServiceProvider 的 mscorlib 程序集。

您可能想要pinvoke CryptEnumProviders以获取可用 CSP 的列表,然后您可以使用CryptoConfig.CreateFromName(...)创建该 CSP 的实例。


你可以尝试这样的事情,如果它的程序集加载到当前的 AppDomain 中,它会找到类型。

var types = AppDomain.CurrentDomain.GetAssemblies()
    .Select(
        a => a.GetTypes()
            .Where( t => typeof(SymmetricAlgorithm).IsAssignableFrom(t) )
    )
于 2010-04-30T19:04:22.813 回答
1

我相信Type.IsSubclassOf仅检查类型是否是指定类型的直接子类。您是否尝试过使用Type.IsAssignableFrom代替?

type => typeof(SymmetricAlgorithm).IsAssignableFrom(type)
于 2010-04-30T18:54:47.360 回答
1

您确定加载了带有 AesCryptoServiceProvider 的程序集吗?Assembly.GetAssembly 只会查看当前加载的程序集集合。

于 2010-04-30T18:56:45.903 回答
0

你应该做什么在 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).aspxPP_ENUMALGS或者PP_ENUMALGS_EX您可以检查此算法。您不会感到困惑,您可以在不同的提供程序 (DLL) 中实现许多相同的算法。不同的提供者可以在不同的地方持有一个密钥(比如智能卡)或者有一些主要的工作,比如 RSA SChannel,但是需要和实现一些其他的算法。

每个算法都已经确定ALG_ID aiAlgid;了 where ALG_IDisunsigned 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

于 2010-05-01T21:59:36.457 回答