使用 PHP Sodium 扩展进行 AEGIS 加密
AEGIS 是基于 AES 的认证加密算法家族,其速度明显快于普遍存在的算法,如 AES-GCM 和 CHACHA20-POLY1305 。如果扩展是使用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 论文提供了有关算法内部工作的详细信息。
PHP 中 AEGIS 的可用性
AEGIS 家装的加密算法在 PHP 中可用需满足以下条件:
- PHP v8.4 及以上版本和
- 使用
libsodium
1.0.19 以上版本编译的 Sodium 扩展及 - 在
x86_64
或aarch64
CPU 架构上
要检测 PHP 中 AEGIS 是否可用,请检测使用 AEGIS 的函数是否可用:
if (function_exists('\sodium_crypto_aead_aegis128l_encrypt')) {
// AEGIS available
}
See PHP 8.4: Sodium: PHP 8.4 中添加的所有的 AEGIS 函数和常量对
AEGIS-128L
和AEGIS-256
的支持
AEGIS-128L
AEGIS-128L
理论上可以对 2^64 位以下的数据长度进行加密,并使用 128 位密钥。它是 Sodium 扩展中唯一使用 128 位密钥的对称加密算法,而其他算法使用 256 位密钥。
它还需要一个 128 位的随机数值,必须提供该值才能解密。
以下是生成密钥和 nonce、使用附加数据加密数据并解密数据的示例:
// generate a random key of sufficient length (16 bytes)
// This value must not be public.
$key = sodium_crypto_aead_aegis128l_keygen();
// Generate random nonce value of SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES length (16 bytes).
// This value should be stored along the encrypted text, but is not required to be private
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES);
// Additional data. This can be a user ID, email address, or empty.
$additional_data = '';
// Message to encrypt
$message = 'Hello';
// Encrypt
$ciphertext = sodium_crypto_aead_aegis128l_encrypt($message, $additional_data, $nonce, $key);
// Decrypt
$decryptedMessage = sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
AEGIS-256
AEGIS-256
使用 256-位密钥,并可以加密 2^64 位以下的数据长度。除了一些例外,AEGIS-256
的计算开销比 AEGIS-128L 高出约20%。
以下是生成密钥和随机数并使用附加数据将明文消息加密和解密为密文并返回的示例:
// generate a random key of sufficient length (32 bytes)
// This value must not be public.
$key = sodium_crypto_aead_aegis256_keygen();
// Generate random nonce value of SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES length (32 bytes).
// This value should be stored along the encrypted text, but is not required to be private
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES);
// Additional data. This can be a user ID, email address, or empty.
$additional_data = '';
// Message to encrypt
$message = 'Hello';
// Encrypt
$ciphertext = sodium_crypto_aead_aegis256_encrypt($message, $additional_data, $nonce, $key);
// Decrypt
$decryptedMessage = sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"
AEGIS 性能对比 AES-GCM 和 CHACHA20-POLY1305
AEGIS 加密算法家族的加密速率比当前推荐的 AES-GCM 算法快大约两到三倍。例如,中等消费类硬件在 AES-GCM 中以大约 2.3 GB/秒的速率对 据进行加密,而 AEGIS 系列算法以 4.5 - 5.0 GB/秒速率进行加密。
以下基准测试结果来自在 AMD Ryzen 4800H CPU 上运行的基准测试,这是一个带有 AES-NI CPU 指令的 x86_64 CPU。
对于数据速率基准,使用 Sodium 扩展中支持的五种算法对 20 MB 的随机字节块进行加密,并取 100 次迭代的平均值。这不包括生成 nonce 和密钥所花费的时间。
Operations/second 基准测试加密了 1 KB 的数据,取 100 万次迭代的平均值。与数据速率基准类似,它不包括 RNG 时间。
Algorithm | Data Rate (GB/sec) | Operations/sec |
---|---|---|
aes256gcm | 2.31 GB/sec | 1,168,300 ops/sec |
chacha20poly1305 | 1.29 GB/sec | 738,411 ops/sec |
chacha20poly1305_ietf | 1.28 GB/sec | 746,409 ops/sec |
xchacha20poly1305 | 1.28 GB/sec | 692,764 ops/sec |
aegis128l | 4.99 GB/sec | 1,925,310 ops/sec |
aegis256 | 4.61 GB/sec | 1,771,924 ops/sec |
AEGIS algorithms are twice as fast as AES-GCM, and 3-4 times as CHACHA20-POLY1305. Benchmarked by encrypting 20 MB of data and taking the average of 100 iterations on an AMD Ryzen 4800H CPU.
AEGIS algorithms can perform more than twice the encryption operations a second compared to AES-GCM. Benchmarked by encrypting 1 KB of data 1 million times on an AMD Ryzen 4800H CPU.
这里的所有 AES 算法在使用 AES-NI
指令的 CPU 上都会更快。它主要是低端移动设备和其他低功耗设备,如嵌入式设备,将不具有 AES-NI
指令。然而,PHP 运行的大多数服务器可能是能够达到类似速度的 CPU,如上面的基准测试结果所示。