使用phpseclib的Crypt_AES类一次加密和解密文件使文件为空

时间:2013-11-05 21:31:42

标签: php aes fopen phpseclib

所以我有一个脚本使用phpseclib一次使用同一个文件进行加密和解密。我所做的是从文件中读取并加密内容并将其写回同一文件。然后我再次读取该文件以获取加密内容并对其进行解密,并将解密后的内容再次写回同一文件。

我原本期望原始文件最终保持不变。不知何故,当在第二步解密加密内容时,解密内容变空。以下是示例代码:

$aes = new Crypt_AES();

$aes->setKey('abcdefghijklmnop');

$filename = "testfile.txt";

$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
$contents = $aes->encrypt($contents);

$handle = fopen($filename, 'w');
fwrite($handle, $contents);
fclose($handle);

$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
$contents = $aes->decrypt($contents);
// I checked out the error_log, the contents became empty here. 
// Shouldn't it be recovered into original content?

$handle = fopen($filename, 'w');
fwrite($handle, $contents);
fclose($handle);

奇怪的是,如果我将脚本分成两个步骤并先运行第一步然后再运行第二步,那么一切都像魅力一样。

我知道这个工作流程有点尴尬,我绝对可以通过在第一次读取时存储原始内容并将其用于以后回写来绕过该问题。只是好奇我在这里做错了什么?感谢

1 个答案:

答案 0 :(得分:1)

问题在于您正在进行多次filesize()次呼叫。完成第一个后,缓存大小。然后写入该文件,然后再次对其filesize()进行操作,filesize()返回上次返回的内容,即使文件大小自上次运行以来已发生更改(由于PKCS填充)。演示:

<?php
file_put_contents('demo.txt', 'zzz');
echo filesize('demo.txt') . "\r\n";
file_put_contents('demo.txt', 'zzzzzz');
echo filesize('demo.txt');

你可能期望返回3和6不是吗?对我而言,它返回3和3。

我建议您使用file_get_contents()file_put_contents()。如果您必须使用fopen和fgets,那么在每次filesize()通话后也可以clearstatcache()