该软件包已被弃用且不再维护。没有建议替代软件包。

PHP 实现的 AES 密码。

dev-master 2023-09-10 02:15 UTC

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