leigh/php-aes

此包的最新版本(dev-master)没有可用的许可证信息。

AES加密算法的纯PHP实现。

dev-master 2023-04-03 06:53 UTC

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);