代码之家  ›  专栏  ›  技术社区  ›  Phil

AesCryptoServiceProvider不是对称算法的一部分?

  •  0
  • Phil  · 技术社区  · 16 年前

    我有一个快速的小应用程序,逐步通过可能的对称加密方法。我用下面这句话来表达:

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

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

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

    4 回复  |  直到 16 年前
        1
  •  2
  •   joshperry    16 年前

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

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

    你可能想 pinvoke CryptEnumProviders CryptoConfig.CreateFromName(...)


    您可以尝试这样的操作,它将在当前AppDomain中加载其程序集时找到类型。

    var types = AppDomain.CurrentDomain.GetAssemblies()
        .Select(
            a => a.GetTypes()
                .Where( t => typeof(SymmetricAlgorithm).IsAssignableFrom(t) )
        )
    
        2
  •  1
  •   Tejs    16 年前

        3
  •  1
  •   dtb    16 年前

    我相信 Type.IsSubclassOf 仅当类型是指定类型的直接子类时进行检查。你用过吗 Type.IsAssignableFrom 相反呢?

    type => typeof(SymmetricAlgorithm).IsAssignableFrom(type)
    
        4
  •  0
  •   Oleg    16 年前

    在win32api中,您应该做的很容易解释。有以下本机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; 哪里 ALG_ID unsigned int 温克雷普特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\u ID crackers”中找到答案 GET_ALG_CLAS() 只是。

    推荐文章