本篇介紹如何在 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
參考資料
- Intel:AES-NI 與 Secure Key
- Intel® Advanced Encryption Standard Instructions (AES-NI)
- RedHat:OpenSSL Intel AES-NI Engine
- Xmodulo:How to check if AES-NI is enabled for OpenSSL on Linux
- Michał Turecki:Getting the most out of SSH – hardware acceleration tuning for AES-NI
- kmg.group:Rsync Faster with AES-NI and ssh options
- nixCraft:How to find out AES-NI (Advanced Encryption) Enabled on Linux System