Я работаю над функцией шифрования, основанной на классах, унаследованных от SymmetricAlgorithm, таких как TripleDes, DES и т.д.
В принципе существует два варианта генерации согласованного ключа и IV для моего класса алгоритма PasswordDeriveBytes
и Rfc2898DeriveBytes
, оба наследуются от абстрактного класса DeriveBytes.
Метод PasswordDeriveBytes.GetBytes()
помечен как устаревший в платформе .NET, тогда как рекомендуется Rfc2898DeriveBytes.GetBytes(), так как он соответствует стандарту PBKDF2. Однако, основываясь на моем тестировании, вызов того же метода GetBytes()
в классе Rfc2898DeriveBytes почти в 15 раз медленнее, чем в классе PasswordDeriveBytes
, что приводит к неожиданному использованию ЦП (всегда выше 50%).
Вот некоторые данные тестирования:
- Итерации: 100
- Тип алгоритма: DES
- Оригинальный текст: "Я - тестовый ключ, зашифруйте меня"
- Время:
- PasswordDeriveBytes: 99ms
- Rfc2898DeriveBytes: 1,373ms
На основе тестирования плохая производительность Rfc2898DeriveBytes
неприемлема в производственной среде.
Кто-нибудь заметил эту проблему раньше? Любое решение, я все еще могу использовать стандартный, не нажимая на производительность? Любой риск использования устаревшего метода (может быть удален в будущей версии)?
Спасибо, ребята!
Edit:
Вероятно, я нашел, где проблема... Номер подсчета итераций по умолчанию для PasswordDeriveBytes
равен 100, а для Rfc2898DeriveBytes
- 1000. После того как я изменил их на тот же номер, что и 1000, выполнение Rfc2898DeriveBytes
двойное время.