leigh / php-aes
此包的最新版本(dev-master)没有可用的许可证信息。
AES加密算法的纯PHP实现。
dev-master
2023-04-03 06:53 UTC
Requires
- php-64bit: >=7.0
Requires (Dev)
- phpunit/phpunit: ~5.0
This package is not auto-updated.
Last update: 2024-09-17 11:40:18 UTC
README
此库包含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有显著的初始化开销(时间和内存),这取决于密钥。如果您计划使用不同的nonce重复使用相同的密钥,可以使用
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);