C# 使用RSACryptoServiceProvider进行签名的速度

C# 使用RSACryptoServiceProvider进行签名的速度,c#,cryptography,hash,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); Crypt

我目前正在做一个简单的数据签名。这是我第一次使用签名,所以也许我只是做错了什么。但我不认为使用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
为什么这么慢?我发现:,但这是.NET2.0的一个问题。我用的是4.0

这需要这么长时间是正常的还是有错误


感谢您的帮助。

执行加密操作需要一段时间的部分原因是因为您不希望人们能够暴力使用您的算法。签署数据的用例是什么?它需要快吗?这是一个简单的检查,以确保数据是有效的还是你需要它被加密

如果你对加密很认真,你可能想看看bouncy castle的东西:

有两点:

(一) 通过直接调用SHA1哈希算法,然后将has传递到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());

只是想让你知道,我一直在经历同样的缓慢获得SHA1签名哈希。有些代码通常每秒对数百个事务执行数十次签名,但很快,每5秒就慢到1次

我在家工作,没有连接到公司的网络。通过谷歌搜索,我终于找到了罪犯。在.NETFramework2.0上,CryptoServiceProvider似乎遇到了一个bug—我相信这与.NETFramework4.0上使用的代码完全相同

根据,由于我暂时的行动迟缓可能是由于RSACryptoServiceProvider的SignData或VerifyData方法试图与我公司的域控制器通信,因此我决定与我的公司建立VPN连接,这是一次即时成功

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


我知道这不是一个解决方案,但至少是一个合理的解决办法。它还可以防止我们失去理智。

你从哪里获得
钥匙串
呢?在我的虚拟机上,在Mac OS X主机上运行Win XP guest,签名不会花费明显的时间。
Data
的大小是兆字节,或者
KeyString
代表一个巨大的RSA密钥,或者两者都代表。KeyString是我以前从RSACryptoProvider获得的字符串。它只是Base64编码中的一个512bit密钥。而且数据肯定只有字节。这只是一个短字符串。与问题无关,因为答案是否定的,对448字节的数据进行签名不应该花费那么长的时间。有这个问题。在读取相同的Microsoft KB之后,我们使用SignHash而不是SignData。然后,SignHash的输入只需要是数据的SHA1哈希值。以前:
rsacryptserviceprovider csp=new rsacryptserviceprovider();byte[]result=csp.SignData(myData,new SHA1CryptoServiceProvider())现在:
rsacyptoserviceprovider csp=new rsacyptoserviceprovider();SHA1Managed sha=新的SHA1Managed();字节[]shaHash=sha.ComputeHash(myData);byte[]result=csp.SignHash(shaHash,null)