PHP与Java AES加解密实现详解及代码对比
本文将详细阐述如何利用PHP实现与Java代码等效的AES加解密效果。我们将分析Java代码的AES算法实现,并提供相应的PHP代码,确保两者在加密和解密结果上保持一致。 这需要选择合适的PHP函数库,并正确处理密钥和初始化向量(IV)。
Java代码通常使用128位密钥,并利用SecureRandom生成密钥。PHP中没有完全等同的密钥生成方法,但我们可以使用openssl_random_pseudo_bytes()
函数生成随机IV,并使用预定义密钥。需要注意的是,Java密钥生成可能使用特定种子字符串,而PHP代码中密钥通常直接使用预定义字符串。 两者通常采用AES-128-CBC模式,此模式需要IV以保证安全性。
以下为PHP实现的AES加解密代码:
<?php class AESUtil { private static $key = "test"; // 默认密钥 /** * AES加密 * @param string $content 待加密数据 * @param string|null $key 密钥,为空则使用默认密钥 * @return string 十六进制加密结果 */ public static function encrypt(string $content, string $key = null): string { $key = $key ?? self::$key; $iv_size = openssl_cipher_iv_length('AES-128-CBC'); $iv = openssl_random_pseudo_bytes($iv_size); $encrypted = openssl_encrypt($content, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); return bin2hex($iv . $encrypted); } /** * AES解密 * @param string $content 十六进制加密数据 * @param string|null $key 密钥,为空则使用默认密钥 * @return string 解密结果 */ public static function decrypt(string $content, string $key = null): string { $key = $key ?? self::$key; $data = hex2bin($content); $iv_size = openssl_cipher_iv_length('AES-128-CBC'); $iv = substr($data, 0, $iv_size); $encrypted = substr($data, $iv_size); return openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); } } // 示例 $plaintext = "Hello, World!"; $encrypted = AESUtil::encrypt($plaintext); $decrypted = AESUtil::decrypt($encrypted); echo "原文: " . $plaintext . PHP_EOL; echo "加密后: " . $encrypted . PHP_EOL; echo "解密后: " . $decrypted . PHP_EOL; ?>
这段PHP代码使用openssl_encrypt
和openssl_decrypt
函数实现AES-128-CBC加密和解密。它也接受密钥参数,并生成随机IV以确保安全性。 与Java代码不同的是,PHP代码将加密结果转换为十六进制字符串输出,以便与Java输出格式保持一致。 实际应用中,应根据具体需求选择合适的密钥长度和加密模式,并注意密钥管理的安全。 记住,"test" 只是一个示例密钥,绝不能在生产环境中使用。 应该使用更安全、更随机的密钥生成方法。