我看到有一个文档错误(#80236)提到 $tag 的使用。以下是一些示例,希望这些示例能帮助到其他人。
<?php
function encrypt(string $plaintext, string $key, string $iv = '', string $aad = ''): string
{
$ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, $aad, 16);
if (false === $ciphertext) {
throw new UnexpectedValueException('加密输入 $plaintext 失败,请检查 $key 和 $iv 是否正确。');
}
return base64_encode($ciphertext . $tag);
}
function decrypt(string $ciphertext, string $key, string $iv = '', string $aad = ''): string
{
$ciphertext = base64_decode($ciphertext);
$authTag = substr($ciphertext, -16);
$tagLength = strlen($authTag);
if ($tagLength > 16 || ($tagLength < 12 && $tagLength !== 8 && $tagLength !== 4)) {
throw new RuntimeException('输入 `$ciphertext` 不完整,字节长度必须是 16、15、14、13、12、8 或 4 之一。');
}
$plaintext = openssl_decrypt(substr($ciphertext, 0, -16), 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $authTag, $aad);
if (false === $plaintext) {
throw new UnexpectedValueException('解密输入 $ciphertext 失败,请检查 $key 和 $iv 是否正确。');
}
return $plaintext;
}
$aesKey = random_bytes(32);
$aesIv = random_bytes(16);
$ciphertext = encrypt('thing', $aesKey, $aesIv);
$plaintext = decrypt($ciphertext, $aesKey, $aesIv);
var_dump($ciphertext);
var_dump($plaintext);