因此,我想知道哈希算法的各种实现之间是否存在重大差异,以SHA系列算法为例。它们都有3种实现,1种在托管代码中,2种包装器围绕着不同的本机加密API,但是使用它们之间有什么重大区别吗?我可以想象包装器版本可以具有更高的性能,因为它是在本机代码中执行的,但是Surley嘿嘿都需要执行完全相同的计算,从而提供相同的输出(例如,嘿嘿是可交换的)。这是正确的吗?
例如,SHA512CNG不能在XP SP2上使用(文档是错误的),但是SHA512MANAGED可以。
@Maxim --谢谢,但不是我想要的。我是在问,使用给定哈希算法的托管/CryptoServiceProvider/CNG实现,除了性能之外,是否有任何不同。使用.NET 3.5,您可以得到所有具有三种实现的哈希算法,因此
SHA512Managed SHA512CryptoServiceProvider SHA512Cng
后两者是本机API的包装器。例如,对于所有SHAxxx实现来说都是如此。
发布于 2008-11-12 21:03:22
一个不同之处是,本地版本(至少其中一些)是FIPS认证的(即美国政府批准的),而管理版本则不是。如果您的代码碰巧运行在配置为"FIPS仅限“的Windows机器上,尝试使用托管版本将失败。
大多数Windows机器都不是以这种方式配置的,但是如果部署到面向政府或国防(或其他高度安全)的环境中,则可能会遇到这种情况。
见http://blogs.msdn.com/shawnfa/archive/2005/05/16/417975.aspx。
发布于 2009-06-16 21:48:21
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;
}我在一个不断增加的大小的循环中运行这个循环,以确定在使用大或小的输入时是否会掉下来。下面是循环,数据如下(我的计算机在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发布于 2016-09-21 11:18:51
我对CNG和managed在SHA512上做了快速而肮脏的比较,这是使用下面代码的所有SHA算法中最慢的。
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%的托管算法版本快得多。
https://stackoverflow.com/questions/211169
复制相似问题