cornworld / aes
该软件包已被弃用且不再维护。没有建议替代软件包。
PHP 实现的 AES 密码。
dev-master
2023-09-10 02:15 UTC
Requires
- php-64bit: >=7.0
Requires (Dev)
- phpunit/phpunit: ~5.0
This package is auto-updated.
Last update: 2023-10-10 02:26:14 UTC
README
PHP 中的 AES
此库包含 AES 分组密码的纯 PHP 实现,以及基于它的几种操作模式。
这些是仅供娱乐/教育的玩具实现,并且不提供任何安全保证。
底层分组密码变体将根据提供的密钥长度自动选择。
- 提供 16 字节密钥时使用 AES-128
- 提供 24 字节密钥时使用 AES-192
- 提供 32 字节密钥时使用 AES-256
用户有责任在使用块模式时确保消息被正确填充。如果提供的信息长度不是 16 字节的倍数,则会抛出异常。
以下块链模式可用
- ECB
- CBC
以下流密码模式可用
- CTR
- CFB
- OFB
以下 AEAD 模式可用
- OCB
- GCM
以下填充方案可用
- PKCS7
- ANSI X.923
- ISO/IEC 7816
用法
所有模式都有一个一次性的 encrypt()
和 decrypt()
方法,这些方法接受不同参数,具体取决于模式。
示例
$key = new AES\Key('abcdefghijklmnop'); $nonce = 'abcdefghijklmnop'; $ctr = new AES\CTR; $ciphertext = $ctr->encrypt($key, $nonce, $plaintext);
所有模式也具有流能力,允许分块进行加密/解密。
要使用任何操作模式,如这种方式,首先需要初始化适当的 Context
。上下文跟踪状态,允许处理更长的消息,以多个块的形式。
加密和解密需要单独的上下文。
示例
$key = new AES\Key('abcdefghijklmnop'); $nonce = 'abcdefghijklmnop'; $ctr = new AES\CTR; $encryptionContext = $ctr->initEncryption($key, $nonce); $ciphertext = $ctr->streamEncrypt($encryptionContext, $plaintext0); $ciphertext .= $ctr->streamEncrypt($encryptionContext, $plaintext1);
AEAD 模式稍微复杂一些。
一些注意事项
- OCB 在流处理时可以随时处理 AAD
- GCM 在流处理时必须首先处理 AAD
- GCM 在使用一次性的
decrypt()
时只在解密前验证标签。它不能使用streamDecrypt()
来做这件事,因为它还没有所有数据。 - GCM 有显著的初始化开销(时间和内存),这与密钥有关。如果您计划使用不同的非随机数重新使用相同的密钥,则可以使用
reInit()
方法 - OCB 和 GCM 的一次性
encrypt()
返回一个包含[$ciphertext, $tag]
的数组 - OCB 和 GCM 在流处理时将输出对齐到 16 字节块,并且
finalise()
返回最终的密文/明文。// TODO: 修复 GCM,OCB 似乎不可能
示例流使用
$key = new AES\Key('abcdefghijklmnop'); $nonce = 'abcdefghijkl'; // 12 byte nonce for GCM $aad = 'Hello' $gcm = new AES\GCM; $encryptionContext = $gcm->initEncryption($key, $nonce); $gcm->aad($aad0); $gcm->aad($aad1); $ciphertext = $gcm->streamEncrypt($encryptionContext, $plaintext0); $ciphertext .= $gcm->streamEncrypt($encryptionContext, $plaintext1); $ciphertext .= $gcm->finalise($context); // $gcm->verify($context, $tag); // If decrypting $tag = $gcm->tag($context);