使用RSACryptoServiceProvider签名的速度

时间:2010-11-23 16:44:48

标签: c# cryptography hash

我目前正在进行一项简单的数据签名工作。这是我第一次使用签名,所以也许我只是做错了。但我不认为使用512位RSA和SHA1散列签署448字节需要4.6秒才是正常的。

代码:

byte[] Data = enc.GetByte(MsgString); //Get Message as byte[]
//Data is 448 bytes long

RSACryptoServiceProvider Crypter = new RSACryptoServiceProvider(512);
Crypter.ImportCspBlob(Convert.FromBase64String(KeyString));

byte[] SignedData = Crypter.SignData(Data, "SHA1"); //Line takes 4.6 seconds

为什么这么慢?我发现了这个:http://support.microsoft.com/kb/948080,但那是.NET 2.0的问题。我正在使用4.0。

这需要很长时间或是否有错误是正常的吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

只是为了让你知道我遇到了同样缓慢的SHA1签名哈希。一些代码通常每秒在数百个事务上签署数十个事务,并且每5秒就会减慢到1个。

我在家工作,而且我与公司的网络无关。经过一些谷歌搜索,我设法找到了罪魁祸首。似乎在.Net Framework 2.0上影响RSACryptoServiceProvider的一个错误 - 我认为它与.Net Framework 4.0上使用的代码完全相同。

根据http://support.microsoft.com/kb/948080,我的临时缓慢可能是由于RSACryptoServiceProvider的SignData或VerifyData方法试图与我公司的域控制器通信,我决定建立VPN连接对我的公司来说,这是一个很好的成功。

现在我立即再次获得SHA1哈希值,而不是等待5秒钟。

我知道这不是一个解决方案,但至少是一个合理的解决方法。它也阻止我们失去理智。

答案 1 :(得分:0)

几点:

1) 通过直接调用SHA1哈希算法然后将其传递给SignHash()方法而不是SignData()方法,我也发现了更高的吞吐量。不确定它是否是SignData()方法中的实现问题,但这似乎是我的经验。

byte[] hash = new SHA1Managed().ComputeHash(data);
byte[] SignedData = Crypter.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));

2)如果你想在一个方法中执行所有操作,请阻止框架进行查找(当你传递字符串“SHA1”时),因为它很昂贵并且可能导致延迟尝试使用以下代替:

byte[] SignedData = Crypter.SignData(Data, new SHA1CryptoServiceProvider());

答案 2 :(得分:-2)

加密操作需要一段时间才能执行的部分原因是因为您不希望人们能够强制您的算法。您的用户签名数据的用例是什么?它需要快吗?这是一个简单的检查,以确保数据有效或您是否需要加密?

如果您认真对待加密,可能需要查看充气城堡的内容:

http://www.bouncycastle.org/