24

そのため、ハッシュアルゴリズムのさまざまな実装に大きな違いがあるかどうか疑問に思っていました.SHAシリーズのアルゴリズムを例にとってみましょう。それらにはすべて、それぞれ 3 つの実装があり、1 つはマネージ コードで、2 つは異なるネイティブ暗号 API のラッパーですが、いずれかを使用する間に大きな違いはありますか? ネイティブ コードで実行されるため、ラッパー バージョンの方がパフォーマンスが高い可能性があると想像できますが、まったく同じ計算を実行し、同じ出力を提供する必要があります。つまり、互換性があります。これは正しいです?

たとえば、SHA512CNG は XP SP2 では使用できません (ドキュメントが間違っています) が、SHA512MANAGED は使用できます。


@マキシム - ありがとうございますが、私が求めていたものではありません。特定のハッシュ アルゴリズムの Managed/CryptoServiceProvider/CNG 実装を使用することで、おそらくパフォーマンス以外に違いがあるかどうかを尋ねていました。.NET 3.5 では、3 つの実装ですべてのハッシュ アルゴリズムを取得できるため、

SHA512マネージド SHA512CryptoServiceProvider SHA512Cng

後者の 2 つは、ネイティブ API のラッパーです。これは、たとえば、すべての SHAxxx 実装に当てはまります。

4

4 に答える 4

18

1つの違いは、ネイティブバージョン(少なくとも一部)はFIPS認定(つまり、米国政府によって承認されている)であるのに対し、管理対象バージョンはそうではないことです。「FIPSのみ」として構成されたWindowsマシンでコードが実行されている場合、管理対象バージョンの使用は失敗します。

ほとんどのWindowsマシンはそのように構成されていませんが、政府または防衛指向(またはその他の非常に安全な)環境に展開している場合は、この状況に遭遇する可能性があります。

http://blogs.msdn.com/shawnfa/archive/2005/05/16/417975.aspxを参照してください。

于 2008-11-12T21:03:22.947 に答える
4

Cngバージョンは少し速いはずですが、それぞれの速度を比較する小さなプログラムを作成しました。(MD5とSHA1のパフォーマンス特性について質問しているクライアントがいました)

MD5とSHA1の間にほとんどまたはまったく違いがないことに驚きましたが、CngとCryptoServiceProviderにわずかな違いがあることにも驚きました。

ソースは非常に単純です。同じ反復を複数回実行するために担当者を追加したので、実行の1つで自分のマシンで何か奇妙なことが起こった場合に備えて、平均化できました。

次のような呼び出しで次のように呼び出します。

CalculateHash(1, 1024, new SHA1CryptoServiceProvider());

static long CalculateHash(UInt64 repetitions, UInt64 size, HashAlgorithm engine)
    {
        RandomNumberGenerator rng = RandomNumberGenerator.Create();

        byte[][] goo = new byte[repetitions][];
        for (UInt64 i = 0; i < repetitions; i++)
        {
            goo[i] = new byte[size];
            rng.GetBytes(goo[i]);
        }

        DateTime start = DateTime.Now;
        for (UInt64 i = 0; i < repetitions; i++)
        {
            engine.ComputeHash(goo[i]);
        }
        return DateTime.Now.Subtract(start).Ticks;
    }

サイズを大きくするループでこれを実行して、大きな入力または小さな入力を使用するときに転倒したかどうかを判断しました。これがループで、データは次のとおりです(私のコンピューターは2 ^ 28でRAMを使い果たしました):

int loops = 32;
        UInt64 reps = 1;

        int width = 20;
        Console.WriteLine("Loop#".PadRight(6) +
                "MD5".PadRight(width) +
                "SHA1".PadRight(width) +
                "SHA1Cng".PadRight(width) +
                "SHA256".PadRight(width) +
                "SHA256Cng".PadRight(width));

        for (int i = 0; i < loops; i++)
        {
            UInt64 size = (UInt64)Math.Pow((double)2, (double)i);

            Console.WriteLine((i + 1).ToString().PadRight(6) +
                CalculateHash(reps, size, new MD5CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA1CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA1Cng() ).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA256CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA256Cng()).ToString().PadRight(width));
        }

Loop# MD5         SHA1        SHA1Cng     SHA256      SHA256Cng
1     50210       0           0           0           0
2     0           0           0           0           0
3     0           0           0           0           0
4     0           0           0           0           0
5     0           0           0           0           0
6     0           0           0           0           0
7     0           0           0           0           0
8     0           0           0           0           0
9     0           0           0           0           0
10    0           0           10042       0           0
11    0           0           0           0           0
12    0           0           0           0           0
13    0           0           0           0           0
14    0           0           0           0           0
15    10042       0           0           10042       10042
16    10042       0           0           0           0
17    0           0           0           10042       10042
18    0           10042       10042       20084       10042
19    0           10042       10042       30126       40168
20    20084       20084       20084       70294       70294
21    30126       40168       40168       140588      140588
22    60252       70294       80336       291218      281176
23    120504      140588      180756      572394      612562
24    241008      281176      361512      1144788     1215082
25    482016      572394      723024      2289576     2420122
26    953990      1134746     1456090     4538984     4830202
27    1907980     2259450     2982474     9118136     9660404
28    3805918     4508858     5804276     18336692    19581900
于 2009-06-16T21:48:21.780 に答える