PHP数据库AES-128-CTR解密报错:数组转字符串问题咨询
AES-128-CTR解密与数组转字符串错误的问题解答
1. 是否可以使用AES-128-CTR模式进行加解密?
完全可以!openssl_decrypt() 原生支持AES-128-CTR模式,这是一种标准的对称加密模式,在PHP的OpenSSL扩展中是合法且常用的选项。只要你的加密和解密过程使用相同的密钥、IV以及加密模式,就能正常完成解密操作。
2. 数组转字符串错误的原因是什么?
看你的代码,问题出在两个关键环节:
- 数组构建逻辑错误:在
while循环里,你把$row(fetch_array()返回的是包含索引和关联键的混合数组)直接赋值给$data['encrypted_data'],每次循环都会覆盖这个键的值,最终$data数组里只保留了最后一条数据,且这条数据是数组类型。 - 解密参数类型不匹配:
openssl_decrypt()的第一个参数要求是字符串类型的密文,但你在foreach循环里把数组类型的$str传了进去,PHP尝试自动将数组转换为字符串时,就会触发“Array to string conversion”的错误。
3. 对应的解决方法是什么?
需要修正数组的构建逻辑,确保传递给openssl_decrypt()的是字符串类型的密文,具体修改如下:
<?php include "connect.php"; $query = "select * from encrypted_data"; $rs = $dbhandle->query($query); $key = hex2bin('2b7e151628aed2a6abf7157803cf5f3a'); $iv = hex2bin('f0f1f2f3f4f5f6f7f8f9fcfbf1fdfbfa'); // 修正:将每条数据的加密字段存入数组 $data = []; while ($row = $rs->fetch_array()) { // 这里假设表中加密数据的字段名为encrypted_data,根据实际表结构调整 $data[] = $row['encrypted_data']; } foreach($data as $str) { // 注意:如果加密时未使用零填充,建议去掉OPENSSL_ZERO_PADDING选项 $output = openssl_decrypt($str, 'AES-128-CTR', $key, OPENSSL_ZERO_PADDING, $iv); echo $output . "<br>"; } ?>
额外提醒:请确认加密过程是否使用了OPENSSL_ZERO_PADDING,如果加密时没有做零填充操作,解密时也应该去掉这个选项,否则可能导致解密结果出现乱码。
内容的提问来源于stack exchange,提问作者Vidatha Karuppan
相关产品推荐
相关产品推荐

