2010-11-23 42 views
9

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

代码:

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。

这是否正常,需要那么长时间还是有错误?

感谢您的任何帮助。

+1

你从哪里得到`KeyString`? – 2010-11-23 20:00:06

+0

在我的虚拟机上运行Mac OS X主机上的Win XP guest虚拟机时,签名没有明显的时间。 “Data”大小为兆字节,或者“KeyString”代表一个巨大的RSA密钥或两者。 – 2010-11-24 01:11:15

+0

KeyString是我之前从RSACryptoProvider中获取的字符串。它只是一个基于Base64编码的512位密钥。而数据只是定义了唯一的字节。它只是一个短的字符串。 – Marks 2010-11-24 11:16:54

回答

-2

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

如果你认真加密你可能要检查出的充气城堡的东西:

http://www.bouncycastle.org/

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()); 
1

只是为了让您知道我一直在体验获得SHA1签名散列的相同速度。通常每秒钟以数百次交易签署数十个代码的代码,每5秒钟减速至1次。

我在家里工作,我没有连接到我公司的网络。经过一些Google搜索之后,我发现了这个罪魁祸首。 .Net Framework 2.0上的RSACryptoServiceProvider似乎有缺陷 - 我认为它与.Net Framework 4.0使用的代码完全相同。

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

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

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