<?php
/**
* EncryptUtil 对称加密 (AES/CBC/PKCS5Padding)
* @author
*/
class EncryptUtil {
/**
* encrypt AES-CBC 加密
* @param string $originalData 要加密的数据
* @param string $secretKey 加密的秘钥
* @return string 加密后的数据 (IV + 密文,十六进制表示)
*/
public static function encrypt($originalData, $secretKey) {
$secretKey = self::_sha1prng($secretKey); // 处理秘钥
$iv = openssl_random_pseudo_bytes(16); // 随机生成 16 字节的 IV
$data = openssl_encrypt($originalData, 'AES-128-CBC', $secretKey, OPENSSL_RAW_DATA, $iv);
$encryptedData = strtoupper(bin2hex($iv . $data)); // 将 IV 和密文拼接,并转换为十六进制
return $encryptedData;
}

/**
* decrypt AES-CBC 解密
* @param string $encryptedData 要解密的数据 (IV + 密文,十六进制表示)
* @param string $secretKey 加密的秘钥
* @return string 解密后的数据
*/
public static function decrypt($encryptedData, $secretKey) {
$secretKey = self::_sha1prng($secretKey); // 处理秘钥
$data = hex2bin($encryptedData); // 转换为二进制数据
$iv = substr($data, 0, 16); // 提取前 16 字节作为 IV
$ciphertext = substr($data, 16); // 提取剩余部分作为密文
$decrypted = openssl_decrypt($ciphertext, 'AES-128-CBC', $secretKey, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}

/**
* SHA1PRNG算法
* @param string $secretKey 加密的秘钥
* @return string 截取的 16 字节密钥
*/
private static function _sha1prng($secretKey) {
return substr(openssl_digest(openssl_digest($secretKey, 'sha1', true), 'sha1', true), 0, 16);
}
}

// 测试代码
$data = '14464614210中文的001';
$secret = "asdfasdasdfsdfasdf23434tgsdfhxcvau4IKf";

// 加密
$encryptData = EncryptUtil::encrypt($data, $secret);
// 解密
$decryptData = EncryptUtil::decrypt($encryptData, $secret);

print_r("original value: " . $data . "\n");
print_r("encrypted value: " . $encryptData . "\n");
print_r("decrypted value: " . $decryptData . "\n");
?>
 
 
Back to Top