AEGIS 是基於 AES 的經過身份驗證的加密算法系列,比 AES-GCM 和 CHACHA20-POLY1305 等普遍存在的算法要快得多。如果 Sodium 擴展是使用 libsodium 1.0.19 或更高版本編譯的,則 PHP 8.4 中的 Sodium 擴展支持 AEGIS-128L 和 AEGIS-256 加密算法。
AEGIS 系列中的兩種加密算法 AEGIS-128L 和 AEGIS-256 比 AES-GCM 快 2-3 倍,比 CHACHA20-POLY1305 算法快 3-4 倍。它們在 x86_64 和 aarch64(64 位 ARM 架構)CPU 架構上利用硬件 AES 加速。
AEGIS 論文提供了有關算法內部工作原理的詳細信息。
AEGIS 在 PHP 上的可用性
在以下情況下,AEGIS 系列加密算法可在 PHP 上使用:
- PHP 版本 8.4 及更高版本以及
- 使用
libsodium 1.0.19及更高版本編譯的 Sodium 擴展 ,以及 - 在
x86_64或aarch64 CPU架構上
要檢查 AEGIS 在 PHP 上是否可用,請檢查其中一個 AEGIS 函數的可用性:
if (function_exists('\sodium_crypto_aead_aegis128l_encrypt')) {
// AEGIS available
}
請參閲 PHP 8.4: Sodium: AEGIS-128L 和 AEGIS-256 支持 PHP 8.4 中添加的所有新 AEGIS 函數和常數。
AEGIS-128L
AEGIS-128L 理論上可以加密低於 2^64 位的數據長度,並使用 128 位密鑰。它是 Sodium 擴展中唯一使用 128 位密鑰的對稱加密算法,而其他算法使用 256 位密鑰。
它還需要一個 128 位 nonce 值,必須提供該值才能解密。
以下是生成密鑰和 nonce、使用其他數據加密數據並對其進行解密的示例:
// 生成一個足夠長度的隨機密鑰(16 字節)
// 此值不得公開
$key = sodium_crypto_aead_aegis128l_keygen();
// 生成一個長度為 SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES(16 字節)的隨機 nonce 值。
// 該值應與加密文本一起存儲,但不需要保密。
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES);
// 附加數據。可以是用户 ID、電子郵件地址,或為空。
$additional_data = '';
// 要加密的消息
$message = 'Hello';
// 加密
$ciphertext = sodium_crypto_aead_aegis128l_encrypt($message, $additional_data, $nonce, $key);
// 解密
$decryptedMessage = sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
AEGIS-256
AEGIS-256 使用 256 位密鑰,可以加密 2^64 位以下的數據長度。除了一些例外,AEGIS-256 的計算量比 AEGIS-128L 高出約 20%。
以下是生成密鑰和 nonce,並使用其他數據將純文本消息加密和解密為密文並返回的示例:
// 生成一個足夠長度的隨機密鑰(32 字節)
// 此值不得公開
$key = sodium_crypto_aead_aegis256_keygen();
// 生成一個長度為 SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES(32 字節)的隨機 nonce 值
// 該值應與加密文本一起存儲,但不需要保密
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES);
// 附加數據。可以是用户 ID、電子郵箱地址,也可以為空。
$additional_data = '';
// 要加密的消息
$message = 'Hello';
// 加密
$ciphertext = sodium_crypto_aead_aegis256_encrypt($message, $additional_data, $nonce, $key);
// 解密
$decryptedMessage = sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
AEGIS 針對 AES-GCM 和 CHACHA20-POLY1305 的性能
AEGIS 系列加密算法的加密速率比當前推薦的 AES-GCM 算法快約 2 到 3 倍 。例如,中等消費類硬件以大約 2.3 GB/秒的速率加密 AES-GCM 中的數據,而 AEGIS 系列算法以 4.5-5.0 GB/秒的速率加密。
以下基準測試結果來自在 AMD Ryzen 4800H CPU 上運行的基準測試,該 CPU 是具有 AES-NI CPU 指令的 x86_64CPU。
對於數據速率基準測試,使用 Sodium 擴展支持的五種算法對 20 MB 的隨機字節塊進行加密,平均迭代 100 次。這不包括生成 nonce 和 key 所花費的時間。
Operations/second 基準測試加密了 1 KB 的數據,取 100 萬次迭代的平均值。與數據速率基準類似,它不包括 RNG 時間。
| 算法 (Algorithm) | 數據速率 (Data Rate) | 作數/秒 (Operations/sec) |
|---|---|---|
| aes256gcm | 2.31 GB/秒 | 1,168,300 次/秒 |
| chacha20poly1305 | 1.29 GB/秒 | 738,411 次/秒 |
| chacha20poly1305_ietf | 1.28 GB/秒 | 746,409 次/秒 |
| xchacha20poly1305 | 1.28 GB/秒 | 692,764 次/秒 |
| aegis128l | 4.99 GB/秒 | 1,925,310 次/秒 |
| aegis256 | 4.61 GB/秒 | 1,771,924 次/秒 |
AMD Ryzen 4800H CPU 上加密 20 MB 數據並取 100 次迭代的平均值。
4800H CPU 上對 1 KB 數據進行 100 萬次加密。
本文中的所有 AES 算法在帶有指令的 CPU 上都會更快AES-NI。主要應用於低端移動設備和其他低功耗設備(例如嵌入式設備),這些設備不帶有AES-NI指令。然而,運行 PHP 的大多數服務器的 CPU 很可能能夠達到類似的速度,如上面的基準測試結果所示。