Do not use this in production! This is a toy project to explore System.Runtime.Intrinsics
and AES-NI
Currently with support for ECB, CBC and GCM encrypt/decrypt (all NIST KATs passing). Adding all sorts of paddings is also supported, removing & verifying it is on my todo list... Other modes of use may follow as well.
Method | Mean | Error | StdDev |
---|---|---|---|
Aes128BitKeyExpansion | 35.91 ns | 0.6520 ns | 0.6099 ns |
Aes192BitKeyExpansion | 47.13 ns | 0.7675 ns | 0.6804 ns |
Aes256BitKeyExpansion | 42.32 ns | 0.9240 ns | 0.9887 ns |
Method | KeySize | DataSize | AadDataSize | Mean | Error | Ratio |
---|---|---|---|---|---|---|
AesNi | 128 | 16 | 0 | 116.9 ns | 0.9230 ns | 0.59 |
Framework | 128 | 16 | 0 | 196.7 ns | 0.2843 ns | 1.00 |
AesNi | 128 | 16 | 16 | 125.9 ns | 0.7349 ns | 0.60 |
Framework | 128 | 16 | 16 | 209.8 ns | 1.3427 ns | 1.00 |
AesNi | 128 | 16 | 1024 | 363.3 ns | 1.4387 ns | 1.02 |
Framework | 128 | 16 | 1024 | 357.8 ns | 1.2221 ns | 1.00 |
AesNi | 128 | 16 | 1048576 | 251,047.3 ns | 635.6994 ns | 1.69 |
Framework | 128 | 16 | 1048576 | 148,721.9 ns | 328.4326 ns | 1.00 |
AesNi | 128 | 1024 | 0 | 513.7 ns | 1.6526 ns | 1.08 |
Framework | 128 | 1024 | 0 | 475.1 ns | 1.6877 ns | 1.00 |
AesNi | 128 | 1024 | 16 | 515.3 ns | 1.3066 ns | 1.09 |
Framework | 128 | 1024 | 16 | 472.2 ns | 2.3596 ns | 1.00 |
AesNi | 128 | 1024 | 1024 | 766.6 ns | 1.5603 ns | 1.21 |
Framework | 128 | 1024 | 1024 | 635.7 ns | 2.5873 ns | 1.00 |
AesNi | 128 | 1024 | 1048576 | 259,308.8 ns | 1,252.8282 ns | 1.70 |
Framework | 128 | 1024 | 1048576 | 152,773.2 ns | 851.4720 ns | 1.00 |
AesNi | 128 | 1048576 | 0 | 422,961.0 ns | 2,256.4577 ns | 1.59 |
Framework | 128 | 1048576 | 0 | 266,618.2 ns | 422.4311 ns | 1.00 |
AesNi | 128 | 1048576 | 16 | 424,680.1 ns | 3,185.9390 ns | 1.59 |
Framework | 128 | 1048576 | 16 | 267,013.1 ns | 1,777.2603 ns | 1.00 |
AesNi | 128 | 1048576 | 1024 | 434,743.8 ns | 4,371.0678 ns | 1.59 |
Framework | 128 | 1048576 | 1024 | 273,610.6 ns | 450.4404 ns | 1.00 |
AesNi | 128 | 1048576 | 1048576 | 689,697.7 ns | 868.5420 ns | 1.64 |
Framework | 128 | 1048576 | 1048576 | 421,531.7 ns | 3,582.6085 ns | 1.00 |
AesNi | 192 | 16 | 0 | 143.6 ns | 0.5633 ns | 0.74 |
Framework | 192 | 16 | 0 | 192.9 ns | 0.6242 ns | 1.00 |
AesNi | 192 | 16 | 16 | 153.1 ns | 0.7294 ns | 0.73 |
Framework | 192 | 16 | 16 | 210.9 ns | 0.4006 ns | 1.00 |
AesNi | 192 | 16 | 1024 | 400.2 ns | 0.8833 ns | 1.12 |
Framework | 192 | 16 | 1024 | 356.8 ns | 0.6916 ns | 1.00 |
AesNi | 192 | 16 | 1048576 | 250,448.8 ns | 394.2873 ns | 1.69 |
Framework | 192 | 16 | 1048576 | 148,382.0 ns | 290.7987 ns | 1.00 |
AesNi | 192 | 1024 | 0 | 568.1 ns | 1.1216 ns | 1.16 |
Framework | 192 | 1024 | 0 | 487.6 ns | 6.0360 ns | 1.00 |
AesNi | 192 | 1024 | 16 | 578.4 ns | 1.1946 ns | 1.16 |
Framework | 192 | 1024 | 16 | 499.8 ns | 1.7812 ns | 1.00 |
AesNi | 192 | 1024 | 1024 | 807.0 ns | 1.3291 ns | 1.25 |
Framework | 192 | 1024 | 1024 | 643.6 ns | 1.8400 ns | 1.00 |
AesNi | 192 | 1024 | 1048576 | 262,869.2 ns | 943.2716 ns | 1.73 |
Framework | 192 | 1024 | 1048576 | 152,335.9 ns | 935.3822 ns | 1.00 |
AesNi | 192 | 1048576 | 0 | 438,345.8 ns | 1,060.3746 ns | 1.57 |
Framework | 192 | 1048576 | 0 | 278,631.5 ns | 486.4308 ns | 1.00 |
AesNi | 192 | 1048576 | 16 | 442,616.3 ns | 547.3178 ns | 1.55 |
Framework | 192 | 1048576 | 16 | 286,545.5 ns | 1,512.6367 ns | 1.00 |
AesNi | 192 | 1048576 | 1024 | 450,771.3 ns | 676.5289 ns | 1.55 |
Framework | 192 | 1048576 | 1024 | 290,664.8 ns | 391.3501 ns | 1.00 |
AesNi | 192 | 1048576 | 1048576 | 686,396.4 ns | 14,703.2507 ns | 1.56 |
Framework | 192 | 1048576 | 1048576 | 441,713.9 ns | 494.7152 ns | 1.00 |
AesNi | 256 | 16 | 0 | 141.9 ns | 0.3664 ns | 0.71 |
Framework | 256 | 16 | 0 | 198.5 ns | 0.2866 ns | 1.00 |
AesNi | 256 | 16 | 16 | 156.5 ns | 0.5802 ns | 0.74 |
Framework | 256 | 16 | 16 | 210.5 ns | 0.9646 ns | 1.00 |
AesNi | 256 | 16 | 1024 | 400.8 ns | 7.5786 ns | 1.13 |
Framework | 256 | 16 | 1024 | 355.9 ns | 1.5194 ns | 1.00 |
AesNi | 256 | 16 | 1048576 | 247,994.4 ns | 1,455.3164 ns | 1.69 |
Framework | 256 | 16 | 1048576 | 146,328.1 ns | 1,307.2082 ns | 1.00 |
AesNi | 256 | 1024 | 0 | 544.0 ns | 2.3217 ns | 1.08 |
Framework | 256 | 1024 | 0 | 502.1 ns | 5.9181 ns | 1.00 |
AesNi | 256 | 1024 | 16 | 583.3 ns | 6.9148 ns | 1.13 |
Framework | 256 | 1024 | 16 | 517.3 ns | 4.6781 ns | 1.00 |
AesNi | 256 | 1024 | 1024 | 835.2 ns | 12.4978 ns | 1.32 |
Framework | 256 | 1024 | 1024 | 634.3 ns | 4.9952 ns | 1.00 |
AesNi | 256 | 1024 | 1048576 | 249,924.6 ns | 1,841.8605 ns | 1.68 |
Framework | 256 | 1024 | 1048576 | 148,455.3 ns | 458.4788 ns | 1.00 |
AesNi | 256 | 1048576 | 0 | 442,180.1 ns | 4,221.1879 ns | 1.52 |
Framework | 256 | 1048576 | 0 | 291,458.2 ns | 3,763.9204 ns | 1.00 |
AesNi | 256 | 1048576 | 16 | 438,106.3 ns | 5,505.4349 ns | 1.48 |
Framework | 256 | 1048576 | 16 | 295,714.9 ns | 2,600.2403 ns | 1.00 |
AesNi | 256 | 1048576 | 1024 | 456,180.5 ns | 4,805.1506 ns | 1.63 |
Framework | 256 | 1048576 | 1024 | 280,266.8 ns | 3,468.0828 ns | 1.00 |
AesNi | 256 | 1048576 | 1048576 | 689,585.6 ns | 5,874.2785 ns | 1.63 |
Framework | 256 | 1048576 | 1048576 | 424,188.0 ns | 2,975.6839 ns | 1.00 |
Method | CipherMode | KeySize | DataSize | Mean | Error | Ratio |
---|---|---|---|---|---|---|
AesNi | CBC | 128 | 16 | 51.48 ns | 0.1573 ns | 0.67 |
Framework | CBC | 128 | 16 | 77.08 ns | 0.5826 ns | 1.00 |
AesNi | CBC | 128 | 1024 | 693.96 ns | 1.4697 ns | 0.92 |
Framework | CBC | 128 | 1024 | 752.54 ns | 4.9276 ns | 1.00 |
AesNi | CBC | 128 | 1048576 | 698,223.91 ns | 1,881.7810 ns | 0.98 |
Framework | CBC | 128 | 1048576 | 711,672.78 ns | 4,434.7702 ns | 1.00 |
AesNi | CBC | 192 | 16 | 58.98 ns | 0.4968 ns | 0.71 |
Framework | CBC | 192 | 16 | 82.70 ns | 0.6663 ns | 1.00 |
AesNi | CBC | 192 | 1024 | 862.64 ns | 1.0201 ns | 0.93 |
Framework | CBC | 192 | 1024 | 926.99 ns | 2.3510 ns | 1.00 |
AesNi | CBC | 192 | 1048576 | 842,651.03 ns | 4,075.8823 ns | 0.99 |
Framework | CBC | 192 | 1048576 | 853,973.89 ns | 917.3084 ns | 1.00 |
AesNi | CBC | 256 | 16 | 58.53 ns | 0.1174 ns | 0.70 |
Framework | CBC | 256 | 16 | 83.33 ns | 0.4332 ns | 1.00 |
AesNi | CBC | 256 | 1024 | 859.57 ns | 7.9029 ns | 0.85 |
Framework | CBC | 256 | 1024 | 1,016.35 ns | 2.2197 ns | 1.00 |
AesNi | CBC | 256 | 1048576 | 835,345.80 ns | 8,567.1241 ns | 0.82 |
Framework | CBC | 256 | 1048576 | 1,020,803.67 ns | 2,502.8008 ns | 1.00 |
AesNi | ECB | 128 | 16 | 45.14 ns | 0.1515 ns | 0.58 |
Framework | ECB | 128 | 16 | 77.69 ns | 0.1875 ns | 1.00 |
AesNi | ECB | 128 | 1024 | 132.40 ns | 0.4511 ns | 0.79 |
Framework | ECB | 128 | 1024 | 166.86 ns | 1.3364 ns | 1.00 |
AesNi | ECB | 128 | 1048576 | 141,626.77 ns | 198.7224 ns | 1.48 |
Framework | ECB | 128 | 1048576 | 95,954.07 ns | 171.3752 ns | 1.00 |
AesNi | ECB | 192 | 16 | 51.69 ns | 0.0787 ns | 0.67 |
Framework | ECB | 192 | 16 | 76.63 ns | 0.4839 ns | 1.00 |
AesNi | ECB | 192 | 1024 | 153.73 ns | 0.3768 ns | 0.83 |
Framework | ECB | 192 | 1024 | 185.51 ns | 0.3866 ns | 1.00 |
AesNi | ECB | 192 | 1048576 | 121,029.49 ns | 123.5305 ns | 1.03 |
Framework | ECB | 192 | 1048576 | 117,916.41 ns | 511.1359 ns | 1.00 |
AesNi | ECB | 256 | 16 | 53.39 ns | 0.1102 ns | 0.67 |
Framework | ECB | 256 | 16 | 79.32 ns | 1.0731 ns | 1.00 |
AesNi | ECB | 256 | 1024 | 150.18 ns | 0.4052 ns | 0.71 |
Framework | ECB | 256 | 1024 | 212.85 ns | 2.3061 ns | 1.00 |
AesNi | ECB | 256 | 1048576 | 121,857.20 ns | 605.2357 ns | 0.89 |
Framework | ECB | 256 | 1048576 | 136,291.12 ns | 660.5039 ns | 1.00 |
Method | CipherMode | KeySize | DataSize | Mean | Error | Ratio |
---|---|---|---|---|---|---|
AesNi | CBC | 128 | 16 | 40.56 ns | 0.3099 ns | 0.48 |
Framework | CBC | 128 | 16 | 85.17 ns | 0.7217 ns | 1.00 |
AesNi | CBC | 128 | 1024 | 150.37 ns | 6.1546 ns | 0.82 |
Framework | CBC | 128 | 1024 | 189.60 ns | 1.9181 ns | 1.00 |
AesNi | CBC | 128 | 1048576 | 105,309.20 ns | 536.4942 ns | 0.97 |
Framework | CBC | 128 | 1048576 | 108,803.69 ns | 670.8807 ns | 1.00 |
AesNi | CBC | 192 | 16 | 45.69 ns | 0.9025 ns | 0.54 |
Framework | CBC | 192 | 16 | 84.60 ns | 0.4631 ns | 1.00 |
AesNi | CBC | 192 | 1024 | 155.21 ns | 1.7375 ns | 0.77 |
Framework | CBC | 192 | 1024 | 202.52 ns | 0.8997 ns | 1.00 |
AesNi | CBC | 192 | 1048576 | 124,210.60 ns | 459.2670 ns | 0.99 |
Framework | CBC | 192 | 1048576 | 125,101.53 ns | 198.4721 ns | 1.00 |
AesNi | CBC | 256 | 16 | 45.23 ns | 0.2512 ns | 0.51 |
Framework | CBC | 256 | 16 | 89.06 ns | 0.7113 ns | 1.00 |
AesNi | CBC | 256 | 1024 | 155.90 ns | 1.9114 ns | 0.70 |
Framework | CBC | 256 | 1024 | 224.04 ns | 2.2041 ns | 1.00 |
AesNi | CBC | 256 | 1048576 | 127,773.17 ns | 3,084.0620 ns | 0.90 |
Framework | CBC | 256 | 1048576 | 144,033.44 ns | 359.6341 ns | 1.00 |
AesNi | ECB | 128 | 16 | 31.46 ns | 0.1889 ns | 0.41 |
Framework | ECB | 128 | 16 | 76.86 ns | 0.3054 ns | 1.00 |
AesNi | ECB | 128 | 1024 | 111.58 ns | 1.0203 ns | 0.33 |
Framework | ECB | 128 | 1024 | 339.31 ns | 3.0097 ns | 1.00 |
AesNi | ECB | 128 | 1048576 | 139,299.30 ns | 476.1600 ns | 0.56 |
Framework | ECB | 128 | 1048576 | 250,596.04 ns | 2,637.1993 ns | 1.00 |
AesNi | ECB | 192 | 16 | 36.16 ns | 0.1581 ns | 0.48 |
Framework | ECB | 192 | 16 | 75.77 ns | 0.5718 ns | 1.00 |
AesNi | ECB | 192 | 1024 | 134.45 ns | 0.7831 ns | 0.40 |
Framework | ECB | 192 | 1024 | 333.48 ns | 5.6652 ns | 1.00 |
AesNi | ECB | 192 | 1048576 | 162,322.50 ns | 954.9279 ns | 0.63 |
Framework | ECB | 192 | 1048576 | 259,364.61 ns | 1,087.2464 ns | 1.00 |
AesNi | ECB | 256 | 16 | 36.13 ns | 0.0700 ns | 0.47 |
Framework | ECB | 256 | 16 | 76.63 ns | 0.7104 ns | 1.00 |
AesNi | ECB | 256 | 1024 | 133.11 ns | 0.4417 ns | 0.35 |
Framework | ECB | 256 | 1024 | 375.75 ns | 0.9654 ns | 1.00 |
AesNi | ECB | 256 | 1048576 | 161,534.95 ns | 905.5891 ns | 0.55 |
Framework | ECB | 256 | 1048576 | 294,344.69 ns | 1,807.6672 ns | 1.00 |