根据@Zaph的备注进行更新。
@Zaph:PKCS#7填充是一般填充,应该使用。事实证明,PHP OpenSSL的默认值是PKCS#7。因此,不要添加任何填充选项,您会得到正确的结果。
Openssl_encrypt()
Openssl_decrypt()
我使用的是PHP 5.4.4。
因此,唯一需要的选项是:OPENSSL_RAW_DATA。
请注意,IV(初始化向量)每次都会更改,并存储在输出字符串中。为什么?如果您提供相同的字符串和密码,则每次都肯定是不同的输出字符串。
base64_encoded
它
演示地点:
ideone.com
###加密:
/**
*加密字符串
*
*
*@Param字符串$data
*
*@return字符串-base64_encoded
*/
$cypher = 'aes-256-cbc';
$ivSize = openssl_cipher_iv_length($cypher);
$ivData = openssl_random_pseudo_bytes($ivSize);
$encripted = openssl_encrypt($data,
$cypher,
$key,
OPENSSL_RAW_DATA,
$ivData);
return base64_encode($ivData . $encripted);
}
###解密:
/**
* Decrypt a string
*
* @Param string $data
* @Param string $key
*
* @return string - original text
*/
function decrypt($data, $key) {
$cypher = 'aes-256-cbc';
$ivSize = openssl_cipher_iv_length($cypher);
$data = base64_decode($data);
$ivData = substr($data, 0, $ivSize);
$encData = substr($data, $ivSize);
$output = openssl_decrypt($encData,
$cypher,
$key,
OPENSSL_RAW_DATA,
$ivData);
return $output;
}
运行它:
$srcText = "Hello World! - " . uniqid();
$key = 's7aBkf4Ypn59bWviQziPDXyPasdaYlhQ';
$srcEncrypted = '';
$srcDecrypted = '';
$srcEncrypted = encrypt($srcText, $key);
$srcDecrypted = decrypt($srcEncrypted, $key);
var_dump($srcText,
$srcEncrypted,
$srcDecrypted,
$srcDecrypted == $srcText);
###输出示例:
string 'Hello World! - 5776adf944c52' (length=28)
string 'NOjIIMM0visDbJPmBsAMgH+OQbYiReLBSvzg5JVZTMUOCAtk3CO7FBNs/Dn/vE9s' (length=64)
string 'Hello World! - 5776adf944c52' (length=28)
boolean true