key())); } if (function_exists('openssl_encrypt')) { $iv = random_bytes(12); $tag = ''; $ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $this->key(), OPENSSL_RAW_DATA, $iv, $tag); if ($ciphertext === false) { return ''; } return self::PREFIX_GCM . base64_encode($iv . $tag . $ciphertext); } return ''; } public function decrypt(string $payload): string { $prefix = substr($payload, 0, 3); $raw = base64_decode(substr($payload, 3), true); if ($raw === false) { return ''; } if ($prefix === self::PREFIX_SODIUM && function_exists('sodium_crypto_secretbox_open')) { if (strlen($raw) <= SODIUM_CRYPTO_SECRETBOX_NONCEBYTES) { return ''; } $nonce = substr($raw, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $plaintext = sodium_crypto_secretbox_open(substr($raw, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES), $nonce, $this->key()); return $plaintext === false ? '' : $plaintext; } if ($prefix === self::PREFIX_GCM && function_exists('openssl_decrypt')) { if (strlen($raw) <= 28) { return ''; } $plaintext = openssl_decrypt(substr($raw, 28), 'aes-256-gcm', $this->key(), OPENSSL_RAW_DATA, substr($raw, 0, 12), substr($raw, 12, 16)); return $plaintext === false ? '' : $plaintext; } return ''; } public function encrypt_array(array $data): string { $json = wp_json_encode($data); return is_string($json) ? $this->encrypt($json) : ''; } public function decrypt_array(string $payload): array { if ($payload === '') { return []; } $data = json_decode($this->decrypt($payload), true); return is_array($data) ? $data : []; } }