[Mono-dev] RSA and ECDH

Edward Ned Harvey (mono) edward.harvey.mono at clevertrove.com
Sun Feb 16 15:51:17 UTC 2014


Here are my RSA benchmark results:

Conclusion is that RSA key generation is expensive no matter what, but it's 20x-40x worse on mono.

.NET 4.0, Win 8.1 VM inside a Mac, Debug build, 3 trials average:
1024	27 ms
2048	80 ms
3072	673 ms

.NET 4.0, Win 8.1 VM inside a Mac, Release build, 3 trials average:
1024	14 ms
2048	94 ms
3072	1,273 ms

Mono 3.2.5 on Mac OSX, compiled by VS Debug, 3 trials average:
1024	505 ms
2048	4,718 ms
3072	42,972 ms

Mono 3.2.5 on Mac OSX, compiled by VS Release, 3 trials average:
1024	883 ms
2048	8,310 ms
3072	40,284 ms

Mono 3.2.5 on Mac OSX, compiled by xbuild Debug, 3 trials average:
1024	894 ms
2048	5,756 ms
3072	35,273 ms

Mono 3.2.5 on Mac OSX, compiled by xbuild Release, 3 trials average:
1024	1,215 ms
2048	12,966 ms
3072	18,952 ms

Code to generate these results:

using System;
using System.Collections.Generic;
using System.Security.Cryptography;

namespace FunWithRSAKeys
{
    class Program
    {
        static void Main(string[] args)
        {
            const int numRuns = 3;
            long beforeTicks;
            long afterTicks;
            RSACryptoServiceProvider RSACSP;
            int[] keySizes = { 1024, 2048, 3072 };
            Dictionary<int, double[]> results = new Dictionary<int, double[]>();
            foreach (int keySize in keySizes)
                results[keySize] = new double[numRuns];

            for (int i = 0; i < numRuns; i++)
            {
                System.Console.WriteLine("-----------------------------");
                foreach (int keySize in keySizes)
                {
                    beforeTicks = DateTime.UtcNow.Ticks;
                    RSACSP = new RSACryptoServiceProvider(keySize);
                    RSACSP.ExportParameters(false);   // Minimum effort to guarantee key will actually be generated
                    afterTicks = DateTime.UtcNow.Ticks;
                    double seconds = (double)(afterTicks - beforeTicks) / (double)TimeSpan.TicksPerSecond;
                    results[keySize][i] = seconds;
                    System.Console.WriteLine(keySize.ToString() + " " + seconds.ToString());
                }
            }
            System.Console.WriteLine("----------------------------- Results");
            foreach(int keySize in keySizes)
            {
                System.Console.WriteLine(keySize.ToString() + " " + avg(results[keySize]).ToString());
            }
            System.Console.WriteLine("-----------------------------");
            System.Threading.Thread.Sleep(int.MaxValue);
        }
        static double avg(double[] values)
        {
            double result = 0;
            foreach (double value in values)
                result += value / values.Length;
            return result;
        }
    }
}


More information about the Mono-devel-list mailing list