CNG, CryptoServiceProvider и управляемые реализации HashAlgorithm - PullRequest
19 голосов
/ 17 октября 2008

Так что мне было интересно, есть ли существенные различия между различными реализациями алгоритмов хэширования, например, рассмотрим алгоритм серии SHA. Все они имеют 3 реализации, 1 в управляемом коде и 2 обертки вокруг различных собственных крипто-API, но есть ли существенные различия между использованием любого из них? Я могу себе представить, что версии-обертки могут иметь более высокую производительность, поскольку они выполняются в собственном коде, но все они должны выполнять одни и те же вычисления и, таким образом, обеспечивать один и тот же вывод, т.е. Это правильно?

Например, SHA512CNG нельзя использовать в XP SP2 (документы неверны), но SHA512MANAGED может.


@ Максим - Спасибо, но не совсем то, что я просил. Я спрашивал, есть ли какая-либо разница, помимо возможной производительности, от использования реализаций Managed / CryptoServiceProvider / CNG данного алгоритма хеширования. В .NET 3.5 вы получаете все алгоритмы хеширования с тремя реализациями, поэтому

SHA512Managed SHA512CryptoServiceProvider SHA512Cng

Последние два являются обертками вокруг нативных API. Это верно для всех реализаций SHAxxx, например.

Ответы [ 4 ]

16 голосов
/ 13 ноября 2008

Одно отличие состоит в том, что нативные версии (по крайней мере, некоторые из них) сертифицированы FIPS (т. Е. Одобрены правительством США), а управляемые - нет. Если ваш код работает на компьютере Windows, который был настроен как «Только FIPS», попытки использовать управляемые версии завершатся неудачей.

Большинство машин Windows не настроены таким образом, но если вы развертываете в ориентированной на правительство или оборону (или другую высокозащищенную) среду, вы можете столкнуться с этой ситуацией.

См. http://blogs.msdn.com/shawnfa/archive/2005/05/16/417975.aspx.

3 голосов
/ 17 июня 2009

Предполагается, что версии Cng будут немного быстрее, но я только что написал небольшую программу, которая сравнивает скорости каждой из них. (У меня был клиент, который спрашивал о характеристиках производительности MD5 против SHA1)

Я был удивлен, обнаружив, что между MD5 и SHA1 практически нет различий, но также удивился, что есть небольшая разница в Cng и CryptoServiceProvider.

Источник довольно прост, я добавил повторения, чтобы выполнить одну итерацию несколько раз, чтобы можно было усреднить на случай, если на моей машине будет происходить какая-то странность во время одного из прогонов.

позвоните по следующему номеру:

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;
    }

Я запустил это в цикле увеличения размера, чтобы выяснить, упал ли он при использовании больших или маленьких входов. Вот цикл, и данные следуют (мой компьютер исчерпал RAM в 2 ^ 28):

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
1 голос
/ 21 сентября 2016

Я провел быстрое и грязное сравнение между CNG и managed на SHA512, который является самым медленным из всех алгоритмов SHA AFAIK, используя код ниже.

    static void Main(string[] args)
    {
      int loops = 10000000;
      var data = Encoding.ASCII.GetBytes("123");

      var hashLoop = new Action<HashAlgorithm>((HashAlgorithm ha) =>
      {
        for (int i = 0; i < loops; i++)
          ha.ComputeHash(data);
      });

      var t1 = Task.Factory.StartNew(() =>
      {
        Time(hashLoop, new SHA512Managed());
      });
      var t2 = Task.Factory.StartNew(() =>
      {
        Time(hashLoop, new SHA512Cng());
      });

      Task.WaitAll(t1, t2);
      Console.WriteLine("Benchmark done!");
      Console.ReadKey();
    }
    static void Time(Action<HashAlgorithm> action, HashAlgorithm ha)
    {
      var sw = new Stopwatch();
      sw.Start();
      action(ha);
      sw.Stop();
      Console.WriteLine("{1} done in {0}ms", sw.ElapsedMilliseconds, ha.ToString());
    }

После нескольких прогонов я обнаружил, что разница в том, что КПГ был значительно быстрее, чем управляемая версия алгоритма, примерно с 21.7% to 49.5%

0 голосов
/ 29 августа 2018

Другим отличием между версиями Managed и CNG является поддерживаемая версия .Net Framework: например,

  • Управляемая версия AES начинается с 3.5, а CNG с 4.6.2 и для
  • SHA512, Управляется начинается с 1,1 и Cng с 3,5.

Однако я считаю, что если мы не ограничены версией фреймворка или не поддерживаем старые версии ОС, нам следует использовать версии CNG :

  • Алгоритмы хеширования с постфиксом Cng - единственные, которые используют bcrypt
  • Тот факт, что это может занять больше времени, на самом деле является преимуществом, поскольку он защищает от атак грубой силы: на стороне пользователя 300 мс или 3 мс не имеет значения, в то время как для злоумышленника это порядка 100 величин!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...