我正在尝试将我的加密程序从 des 升级到河豚。我有这个功能用于加密/解密:
function NewCryptStr($EncryptOrDecrypt,$Str)
{
$Key='test';
$IVSize=mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
$IV=mcrypt_create_iv($IVSize,MCRYPT_RAND);
if($EncryptOrDecrypt==='Encrypt')
{
$Str=mcrypt_encrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);
$Str=mysql_real_escape_string($Str);
}
if($EncryptOrDecrypt==='Decrypt')
$Str=mcrypt_decrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);
return $Str;
}
这工作正常:
$Str='test string to be encrypted then decrypted';
print "<p>Original $Str</p>\n";
$Str=NewCryptStr('Encrypt',$Str);
print "<p>Encrypted $Str</p>\n";
$Str=NewCryptStr('Decrypt',$Str);
print "<p>Decrypted $Str</p>\n";
然后我在电子邮件地址表上运行以下 php 脚本来转换一列纯文本并使用加密结果更新另一列:
$sql="select UID,Str from testdata order by UID";
$result=mysql_query($sql,$Link);
while($row=mysql_fetch_array($result))
{
$Encrypted=NewCryptStr('Encrypt',$row[Str]);
$sql="update testdata set Str2='$Encrypted' where UID=$row[UID]";
print "<p>$row[Str] > $Encrypted</p>\n";
print "<p>$sql</p>\n";
mysql_query($sql,$Link) or die("failed $sql ".mysql_error());
}
它运行没有错误并打印出我所期望的大量加密字符串,但是当我查看表中的数据时,没有任何记录被更新为与上面的 php 打印的相同数据。相反,Str2 中的大多数值都是空白的,有些值中有 1 或 2 个字符。
打印的所有 sql 语句看起来都很好,并且单独运行它们会正确更新记录。
sql 表和 mysql 连接都使用 utf8 编码,Str 和 Str2 列是 varchar 数据类型。
为什么我的表格没有用正确的数据更新?
编辑我已经解决了(绕过!)使用基本编码/解码 NewCryptStr 函数的输出/输入的问题。我仍然很想知道为什么当 sql 语句在单独执行时可以愉快地工作时,为什么我的表循环不起作用。