使用phpseclib';s Crypt_AES类一次加密和解密文件,使文件为空

使用phpseclib';s Crypt_AES类一次加密和解密文件,使文件为空,php,aes,fopen,phpseclib,Php,Aes,Fopen,Phpseclib,所以我有一个脚本,用于同时对同一个文件进行加密和解密。我所做的是从一个文件中读取并加密内容,然后将其写回同一个文件。然后我再次读取该文件以获取加密内容并对其进行解密,然后将解密后的内容再次写入同一文件 我希望原始文件最终保持不变。不知何故,在第二步解密加密内容时,解密内容变为空。下面是示例代码: $aes = new Crypt_AES(); $aes->setKey('abcdefghijklmnop'); $filename = "testfile.txt"; $handle =

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

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

$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);
奇怪的是,如果我将脚本分为两个步骤,先运行第一个步骤,然后运行第二个步骤,那么一切都会很顺利


我知道这个工作流程有点笨拙,我肯定可以在第一次读取时存储原始内容并在以后回写时使用它来绕过这个问题。只是好奇我做错了什么?谢谢

问题是您正在执行多个
filesize()
调用。在执行第一个操作后,缓存大小。然后写入文件,然后再次对其执行
filesize()
,并且
filesize()
返回上次返回的内容,即使自上次运行以来文件大小已更改(由于PKCS填充)。演示:


问题是您正在执行多个
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');