首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CNG、CryptoServiceProvider和HashAlgorithm的托管实现

CNG、CryptoServiceProvider和HashAlgorithm的托管实现
EN

Stack Overflow用户
提问于 2008-10-17 05:39:40
回答 4查看 9.7K关注 0票数 24

因此,我想知道哈希算法的各种实现之间是否存在重大差异,以SHA系列算法为例。它们都有3种实现,1种在托管代码中,2种包装器围绕着不同的本机加密API,但是使用它们之间有什么重大区别吗?我可以想象包装器版本可以具有更高的性能,因为它是在本机代码中执行的,但是Surley嘿嘿都需要执行完全相同的计算,从而提供相同的输出(例如,嘿嘿是可交换的)。这是正确的吗?

例如,SHA512CNG不能在XP SP2上使用(文档是错误的),但是SHA512MANAGED可以。

@Maxim --谢谢,但不是我想要的。我是在问,使用给定哈希算法的托管/CryptoServiceProvider/CNG实现,除了性能之外,是否有任何不同。使用.NET 3.5,您可以得到所有具有三种实现的哈希算法,因此

SHA512Managed SHA512CryptoServiceProvider SHA512Cng

后两者是本机API的包装器。例如,对于所有SHAxxx实现来说都是如此。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-12 21:03:22

一个不同之处是,本地版本(至少其中一些)是FIPS认证的(即美国政府批准的),而管理版本则不是。如果您的代码碰巧运行在配置为"FIPS仅限“的Windows机器上,尝试使用托管版本将失败。

大多数Windows机器都不是以这种方式配置的,但是如果部署到面向政府或国防(或其他高度安全)的环境中,则可能会遇到这种情况。

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

票数 18
EN

Stack Overflow用户

发布于 2009-06-16 21:48:21

Cng版本应该更快一点,但我只是写了一个小程序来比较每个版本的速度。(我有一个客户正在询问MD5与SHA1的性能特性)

我惊讶地发现,MD5和SHA1之间几乎没有差别,但也感到惊讶的是,Cng和CryptoServiceProvider之间的差别很小。

源代码非常直接,我添加了代表多次进行相同的迭代,这样我就可以在运行过程中在机器上进行平均处理,以防出现任何奇怪的情况。

用这样的调用调用以下内容:

代码语言:javascript
复制
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的内存中用完了):

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-09-21 11:18:51

我对CNGmanaged在SHA512上做了快速而肮脏的比较,这是使用下面代码的所有SHA算法中最慢的。

代码语言:javascript
复制
    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());
    }

运行几次后,我发现不同之处在于CNG比使用21.7% to 49.5%的托管算法版本快得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/211169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档