0

可能な対称暗号化方法をステップ実行する簡単な小さなアプリがあります。次の行でそれらを取得します。

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

これを実行するとわかるように、AesCryptoServiceProvider は、SymmetricAlgorithm に属し、リストに表示される AES から継承されていますが、このグループのメンバーではありません。これはそれほど問題にはなりません。プロバイダーがあればグループに手動で追加できますが、名前でこのタイプを取得しようとすると、次のようになります。

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

AesCryptoServiceProvider の null オブジェクトを取得しますが、グループ内の他のアイテムのオブジェクトは取得しません。

これは本当に奇妙で、誰かアイデアがあるかどうか疑問に思っています。このため、tripleDES を使用する必要が生じています (私のマシンはすべて FIPS 準拠要件を実行しているため)。

助けてくれてありがとう!

4

4 に答える 4

2

SymmetricAlgorithm は mscorlib.dll にあり、AesCryptoServiceProvider は System.Core.dll にあります。

SymmetricAlgorithm 型に基づいてアセンブリを取得すると、AesCryptoServiceProvider を含まない mscorlib アセンブリが取得されます。

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 があります。

CryptEnumProvidersCryptEnumProviderTypesCryptGetDefaultProvider

を調べるほど多くのことはありませんHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Providerhttp://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_ENCRYPTGET_ALG_CLAS()「ALG_ID クラッカー」から、すべてのアルゴリズムのクラス部分とフィルターALG_CLASS_DATA_ENCRYPTのみを簡単に見つけることができます。

于 2010-05-01T21:59:36.457 に答える