Linux

Linux 檢查、測試 CPU AES-NI 硬體加速加密指令集教學

本篇介紹如何在 Linux 系統上檢查 Intel CPU 是否有支援 AES-NI 加密指令集,並以 OpenSSL 測試 AES-NI 硬體加速的效果。

Intel 的 AES-NI(Advanced Encryption Standard New Instructions)加密指令集可以透過硬體來提升 AES 加密演算法的計算速度,若在 Linux 中要檢查 CPU 是否有支援 AES-NI,可以查看 /proc/cpuinfo 中是否有 aes 這個旗標(flag):

# 檢查 CPU 是否支援 AES-NI
grep -m1 -o aes /proc/cpuinfo
aes

在這個指令的輸出中,若有出現 aes 就代表目前的 CPU 有支援 AES-NI。

OpenSSL 測試 AES-NI 硬體加速

若想要測試 AES-NI 硬體加速的效果,可以先用 openssl 以普通的方式測試一次 AES 加密演算法的計算速度:

# 測試 AES 加密演算法計算速度
openssl speed aes-128-cbc
Doing aes-128 cbc for 3s on 16 size blocks: 42606999 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 64 size blocks: 11376625 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 256 size blocks: 2776620 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 1024 size blocks: 712287 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 8192 size blocks: 90480 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 16384 size blocks: 45431 aes-128 cbc's in 3.00s
OpenSSL 1.1.1f  31 Mar 2020
built on: Tue May  3 17:49:36 2022 UTC
options:bn(64,64) rc4(16x,int) des(int) aes(partial) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-7zx7z2/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
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     227997.32k   243513.04k   237730.68k   243127.30k   247897.04k   248113.83k

接著以相同的 openssl 指令,加上 -evp 參數啟用 AES-NI 硬體加速:

# 測試 AES 加密演算法計算速度(啟用 AES-NI 硬體加速)
openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 173456741 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 64 size blocks: 60889151 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 256 size blocks: 15642769 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 1024 size blocks: 3843223 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 492582 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 16384 size blocks: 242219 aes-128-cbc's in 3.00s
OpenSSL 1.1.1f  31 Mar 2020
built on: Tue May  3 17:49:36 2022 UTC
options:bn(64,64) rc4(16x,int) des(int) aes(partial) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-7zx7z2/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
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     928196.61k  1303312.93k  1339314.00k  1311820.12k  1349575.83k  1322838.70k

以 block size 為 16 bytes 的測試來說,未採用 AES-NI 的運算速度是 227997.32k,而改用 AES-NI 硬體加速之後就提升至 928196.61k,也就是說 AES-NI 加密處理速度是普通 CPU 指令集處理速度的四倍,而不同的 block size 測試出來的結果也不同,例如 block size 為 64 bytes 的狀況下,AES-NI 加速就可以超過五倍。

OpenSSH 測試 AES-NI 硬體加速

OpenSSH 支援的加密方式有多種,我們可以用以下指令查詢 ssh 指令支援的加密方式:

# 查詢可用的加密方式
ssh -Q cipher
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
rijndael-cbc@lysator.liu.se
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com

而實際上在連線時可以使用的加密方式就要看 SSH 伺服器的設定(可參考 sshd_config 的線上手冊)。

ssh 連線時可以用 -c 參數指定要採用的加密方式,例如採用 aes256-ctr

# 測試 OpenSSH 加密速度
dd if=/dev/zero count=100 bs=1M | ssh -c aes256-ctr ubuntu@localhost "cat >/dev/null"
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.635879 s, 165 MB/s

不同的加密方式會有不同的資料處理速度,尤其是 AES 演算法採用了 AES-NI 硬體加速之後,速度都會比其他類型的加密方式快很多,我們可以用以下指令來測試各種加密方式的速度(要先設定好金鑰認證,才不用打密碼):

# 測試 OpenSSH 各種加密方式的速度
for i in `ssh -Q cipher`; do dd if=/dev/zero bs=1M count=100 2> /dev/null \
  | ssh -c $i ubuntu@localhost "(time -p cat) > /dev/null" 2>&1 \
  | grep real | awk '{print "'$i': "100 / $2" MB/s" }'; done
aes128-ctr: 526.316 MB/s
aes192-ctr: 454.545 MB/s
aes256-ctr: 434.783 MB/s
aes128-gcm@openssh.com: 588.235 MB/s
aes256-gcm@openssh.com: 555.556 MB/s
chacha20-poly1305@openssh.com: 227.273 MB/s

在實際的應用上,若需要以 rsync 傳輸大量資料時,就可以考慮選擇比較快的加密方式:

# rsync 指定加密方式
rsync -av -e "ssh -T -o Compression=no -x -c aes128-gcm@openssh.com" /your/path ubuntu@your.host:/your/path

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago