Производительность VerifyData настолько плоха, что функция практически бесполезна, или я делаю что-то очень неправильное в приведенном ниже коде?
open System
open System.Security.Cryptography
let keySize = 1024 // bits
let testDataLen = 1000
let iterations = 100
let hashAlg = "SHA1"
let timer f =
let start = DateTime.Now
f() |> ignore
let finish = DateTime.Now
finish - start
let bench () =
use rsaSP = new RSACryptoServiceProvider(keySize)
let rnd = Random()
let data = Array.create testDataLen 0uy
rnd.NextBytes data
let signature = rsaSP.SignData(data, hashAlg)
let isValid = [for i in 1..iterations -> rsaSP.VerifyData(data, hashAlg, signature)]
|> List.forall id
if not isValid then failwith "Bad signature."
printfn "%d iterations took %A" iterations (timer bench)
100 Для звонков в VerifyData требуются полные 3 секунды для двухъядерного процессора с частотой 2,1 ГГц и 32-разрядной операционной системы XP.
Я также пытался заменить строку "SHA1" на объект SHA1CryptoServiceProvider, который используется повторно (без новых экземпляров в цикле), но это не имеет значения.
0,03 секунды для одного вызова VerifyData - что здесь происходит?
Редактирование / обновление: только что попытался написать функции F #, используя BigInteger.ModPow, мою собственную функцию заполнения и SHA1CryptoServiceProvider.ComputeHash. 100 итераций заканчиваются за 0,07 секунды, что в 40 раз быстрее, чем RSACryptoServiceProvider. (Эти результаты должны были быть неверными. Будет пересмотрен позже.)