代码之家  ›  专栏  ›  技术社区  ›  Marks

使用rsaccryptoserviceprovider签名的速度

  •  9
  • Marks  · 技术社区  · 15 年前

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

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Julio Nobre    13 年前

    只是让你知道,我一直在经历同样的缓慢获得SHA1签名散列。一些通常每秒在数百个事务上签名数十个的代码,突然地,每5秒就慢到1个。

    我在家工作,没有和公司的网络连接。经过一番搜索,我终于找到了罪魁祸首。rsacyptoserviceprovider在.Net Framework 2.0上似乎遇到了一个bug,我相信它与.Net Framework 4.0上使用的代码完全相同。

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

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

        2
  •  0
  •   Gerald Davis    15 年前

    两点:

    通过直接调用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());
    
        3
  •  -2
  •   Patrick Hofman Wahid Bitar    9 年前

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

    http://www.bouncycastle.org/