此主机扫描中最快的 SSL 加密算法是什么?



我通过SSL从服务器接收(很多)非敏感数据。作为客户端,我希望将OpenSSL会话配置为尽可能快。

我已经查询了服务器以列出其接受的SSL密码(见下文)。

我希望服务器启用空SSL密码,但我认为它没有?

  1. 这些加密算法中哪一种在现代 (2015+) 英特尔 x86 处理器上是最快的?
  2. 是否有任何其他 OpenSSL 设置/标志/模式/编译器开关可以更改以提高性能,而忽略安全性?

输出:

NSOCK ERROR [0.1220s] ssl_init_helper(): OpenSSL legacy provider failed to load.
Host is up (0.017s latency).
Other addresses for ********** (not scanned): **************************
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256-draft (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256-draft (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|   TLSv1.3: 
|     ciphers: 
|       TLS_AKE_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_AKE_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|     cipher preference: client
|_  least strength: A

Nmap done: 1 IP address (1 host up) scanned in 2.62 seconds

公钥算法可能会影响连接设置的速度,但我认为一旦启动并运行,只有对称密码和MAC(消息身份验证代码)才能主导性能。 (例如 AES-128 和 SHA1)。

openssl speed应该告诉你原始算法。 对于对称密码,我想查看服务器用于这些密钥的任何密钥大小的验证/秒。

自Nehalem以来,AES在x86中具有硬件加速(AES新指令,又名AES-NI),因此您肯定希望将其作为对称密码。AES128 比 192 或 256 快一些。 IDK哪种模式,CBC或GCM,会更快。

在哈希选项中,没有 SHA 扩展,SHA1(160 位)是最快的,其次是 SHA-512,其次是 SHA256.
(SHA-512 具有不同的内部结构,允许比 SHA256 更高效的 SIMD 实现,IIRC 不必在小块或类似的东西中随机排列。

x86 中是否有任何加速 SHA (SHA1/2/256/512) 编码的指令?SHA 新指令 (SHA-NI) 仍然没有普及,2015 年的 CPU 不会有它们:

  • AMD 自 Zen 1 以来。(在OpenSSL速度测试中加速550%)。
  • 英特尔自戈德蒙特以来的低功耗
  • 英特尔自Ice Lake以来成为主流(实际上是Cannon Lake,存在于几种笔记本电脑型号中。

在配备 SHA-NI 的 CPU 上,SHA1 将比 SHA-512 走得更远。 SHA256也将加速,因此它将接近或可能等于SHA1。 但是SHA-512并没有被SHA-NI加速。


测试结果与openssl speed,在 Arch GNU/Linux 上使用 OpenSSL 版本 1.1.1q,使用其二进制包。

CPU:i7-6700k Skylake于2015年发布,运行频率为4.2GHz,系统的其余部分大部分处于空闲状态,除了我在Chromium中输入此答案。energy_performance_preference设置为在所有内核上performance。 (Linux 5.19 内核)。

DDR4-2666 DRAM,尽管这并不重要,因为一切都会在缓存中命中。 L1d 缓存大小为 32K,L2 缓存大小为 256K。因此,测试的最大块大小openssl(16K)将完全填满L1d缓存,可能会有一些遗漏,用于从一个缓冲区复制到另一个缓冲区的密码。 但他们仍然会得到L2缓存命中,所以这可能不是瓶颈。

仅读取数据的哈希将避免所有缓存未命中。

我的CPU有AVX2,而不是AVX-512。 AVX-512可能对SHA有帮助。 不太可能帮助AES,尽管它可以从VAES扩展中获得一些东西,以使用更少的CPU时间来解密AES。

分组密码:正如预期的那样,AES-128 是 8K/16K 块的最快分组密码。 (RC4的速度大约是其两倍,但绝对不安全,并且不是SSL/TLS选项之一。

# selected results from openssl speed
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
aes-128 cbc   281173.41k   294162.15k   295066.20k   297662.07k   298541.06k   293197.14k
aes-192 cbc   241961.70k   252595.05k   252103.08k   257893.89k   254962.35k   256365.91k
aes-256 cbc   215042.86k   223668.33k   220263.25k   223360.00k   223918.32k   223477.76k

哈希:SHA1(160 位)最快,SHA256 最慢,如果您知道 SHA-512 更适合 AVX2 或 AVX-512 实现,而无需 SHA-NI 的专门支持,则正如预期的那样。

MD5 的速度与 SHA512 大致相同(148028 3.0 秒),因此即使它可用,您也不会想要它。 其他非标准哈希比 SHA1 慢。

type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha1          173375.55k   401452.57k   800641.11k  1037854.38k  1152974.85k  1164574.72k
sha256        101270.31k   218436.46k   397949.95k   491700.57k   527214.11k   525238.27k
sha512         68755.59k   273395.48k   457441.88k   675966.63k   782669.14k   787906.56k
md5           166305.53k   367672.73k   616191.32k   761831.08k   800680.62k   811134.03k
hmac(md5)      65136.17k   198369.19k   459400.36k   662287.36k   798291.29k   802570.24k

因此,SHA1 的运行速度约为 1.1GB/s,而 AES128-CBC在单个内核上的运行速度仅为 300 MB/s,仅比千兆以太网快约 3 倍。 (memcpy速度更像是20 GB/s,所以它们都比这慢得多。

如果您的接收器使用多个连接,它可以将 CPU 负载分配给多个线程,从而分布在内核上。


有关最新CPU上的加密基准测试,请查看Phoronix文章,例如Apple M2与AMD Rembrandt(Zen 3)与Intel Alder Lake Linux基准测试。 他们正在并行化其加密吞吐量,例如 SHA256 吞吐量随核心计数而扩展。

同样,这个答案是假设您使用的软件像OpenSSL一样利用CPU的指令集,以获得与OpenSSL相似的速度。

最新更新