blog.su21.org   Archives  About

AES 加密优化

最近在优化一块 UDP 协议加密模块。 加密算法用到了 AES。 dotnet BCL 实现会有不可避免的内存分配,我不是特别满意。 对于需要特别优化的情景, AES 完全可以原地加密解密,避免额外的内存分配与数据拷贝。

加密

AES 对加密数据长度有要求,加密数据需要 padding 补齐到 N×BlockSize 字节。

实现中选用了 PKCS#7 中约定的 padding方案,具体算法如下:

padding 后密文要比明文长,但 padding 长度是有上限的:最多增多 BlockSize 字节。 如果存储原文的 buffer 预留 padding 的空间,那么也可以做到原地加密,无需分配额外内存。

解密

解密只需原地解密,舍弃多余的 padding 即可。

接口设计如下

public class Aes
{
	public Aes(byte[] key);

	// 原地加密数据,调用方保证 padding
	public void Encrypt(byte[] data, int offset, int count);

	// 原地解密,调用方保证数据长度合法
	public void Decrypt(byte[] data, int offset, int count);
}

Bencmark

做了一版用 Simd 的实现和一版纯 CSharp 的实现,和 BCL 实现对比如下

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.503 (1809/October2018Update/Redstone5)
Intel Core i9-9900K CPU 3.60GHz (Coffee Lake), 1 CPU, 16 logical and 8 physical cores
.NET Core SDK=3.0.100-preview5-011568
  [Host] : .NET Core 3.0.0-preview5-27626-15 (CoreCLR 4.6.27622.75, CoreFX 4.700.19.22408), 64bit RyuJIT
  Core   : .NET Core 3.0.0-preview5-27626-15 (CoreCLR 4.6.27622.75, CoreFX 4.700.19.22408), 64bit RyuJIT

Job=Core  Runtime=Core  
Method N Mean Error StdDev Rank Gen 0 Gen 1 Gen 2 Allocated
SimdAES 64 37.47 ns 0.7406 ns 0.7924 ns 1 - - - -
SoftAES 64 1,044.83 ns 20.6364 ns 32.1283 ns 10 - - - -
BCLAES 64 254.62 ns 0.9572 ns 0.8954 ns 3 0.0701 - - 440 B
SimdAES 128 69.42 ns 0.2799 ns 0.2618 ns 2 - - - -
SoftAES 128 2,092.56 ns 8.4587 ns 7.4984 ns 12 - - - -
BCLAES 128 297.62 ns 3.8661 ns 3.6163 ns 5 0.1211 - - 760 B
SimdAES 512 261.56 ns 4.1769 ns 3.9071 ns 4 - - - -
SoftAES 512 8,309.41 ns 125.6760 ns 111.4085 ns 13 - - - -
BCLAES 512 595.59 ns 5.2638 ns 4.9237 ns 7 0.4263 - - 2680 B
SimdAES 1024 536.77 ns 9.6029 ns 8.9826 ns 6 - - - -
SoftAES 1024 16,871.83 ns 270.3667 ns 252.9012 ns 14 - - - -
BCLAES 1024 992.60 ns 19.2421 ns 22.1592 ns 8 0.8335 - - 5240 B
SimdAES 2048 1,037.46 ns 10.0816 ns 9.4303 ns 9 - - - -
SoftAES 2048 33,012.68 ns 106.9043 ns 99.9984 ns 15 - - - -
BCLAES 2048 1,680.53 ns 33.2775 ns 68.7239 ns 11 1.6499 0.0038 - 10360 B

Written on Jun 8, 2019.