Скорость подписи с RSACryptoServiceProvider - PullRequest
9 голосов
/ 23 ноября 2010

В настоящее время я работаю над простой частью подписи данных.Это первый раз, когда я использую подпись, так что, возможно, я просто что-то делаю неправильно.Но я не думаю, что это нормально, что для подписания 448 байтов с использованием 512-битного RSA и SHA1-хэширования требуется 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 ]

1 голос
/ 22 июля 2012

Просто чтобы сообщить вам, что я испытываю ту же медлительность, получая подписанные SHA1 хэши.Некоторый код, который обычно подписывал десятки на сотни транзакций в секунду, неожиданно замедлялся до 1 каждые 5 секунд.

Я работал дома и не был подключен к сети моей компании.После некоторого поиска, мне удалось обнаружить виновника.Ошибка, которая, по-видимому, влияет на RSACryptoServiceProvider в .Net Framework 2.0 - я считаю, что это ТОЧНО тот же код, который использовался в .Net Framework 4.0.

Поскольку, согласно http://support.microsoft.com/kb/948080,, моя временная медлительность может бытьи оба метода RSACryptoServiceProvider SignData или VerifyData, пытающиеся установить связь с контроллером домена моей компании, я решил установить VPN-соединение с моей компанией, что имело непосредственный успех.

Теперь я снова получаю хэши SHA1, вместо ожиданиядо 5 секунд.

Я знаю, что это не решение, но, по крайней мере, разумный обходной путь.Это также препятствует тому, чтобы мы потеряли здравомыслие.

0 голосов
/ 23 ноября 2010

Пара баллов:

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());
0 голосов
/ 23 ноября 2010

Одной из причин того, почему операции шифрования занимают некоторое время, является то, что вы не хотите, чтобы люди могли грубо форсировать ваш алгоритм. Какой у вас вариант использования для подписи ваших данных? Это должно быть быстро? Это простая проверка, чтобы убедиться, что данные действительны или вам нужно, чтобы они были зашифрованы?

Если вы серьезно относитесь к шифрованию, возможно, вы захотите взглянуть на вещи с надувным замком:

http://www.bouncycastle.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...