加密字符串写入文件,然后在PHP中解密文件

时间:2016-06-28 15:06:27

标签: php file encryption php-openssl

我在使用“openssl_encrypt”来加密包含HTML的文本字符串,将该字符串写入文件,然后在单独的页面中,我遇到了一个小问题,我是使用“openssl_decrypt”解密整个文件。我确保使用相同的加密密钥,相同的方法,以及相同的iv。我想这是作为加密的新手,我只是看不到。提前感谢您的帮助!

以下是一些示例代码:

//An example of the string
$string = "<div class='mod'><div><span class='datetimestamp'>On 06/28/2016 at 04:32:09 PM, ** modified a record with id of \"5\" in the \"results\" table:</span><br><span class='record-label'>Prev Record:</span>jobnumber='none', dropdate='07/06/2016', eventdate='07/16/2016', dealership='ABC Nissan', pieces='3700', datatype='DB', letter='t'";

//The encryption
$encrypt = openssl_encrypt($string, 'AES-256-XTS', '93jkak3rzp72', 1, '45gh354687ls0349');
$file = fopen("logs/2016-06-28.log", 'a');
fwrite($file, $encrypt);
fclose($file);


//The decryption - DONE IN A SEPARATE PAGE
$file = @fopen("logs/2016-06-28.log", "r");
if ($file) {
    while (($data = fgets($file)) !== false) {
        $decrypt .= openssl_decrypt($data, 'AES-256-XTS', '93jkak3rzp72', 1, '45gh354687ls0349');
    }
}

2 个答案:

答案 0 :(得分:2)

我不会使用fgets(),因为它一次只能从文件中获取一行,并且您无法分割加密的字符串并一次解密单个部分。

您可以使用fgets(),但您需要读取所有内容并将其存储在变量中,然后在解密后再进行解密。

或者,您只需使用file_get_contents()之类的内容即可获取整个文件的内容,然后进行解密。

答案 1 :(得分:2)

也许问题是你试图附加额外的加密数据,这通常不会因为几个原因而起作用,主要的一个原因是AES是基于块的,很可能是填充。许多模式使用某种形式的链接,并且在附加加密数据时也会失败。

您正在以附加模式打开要写入的文件,而不是您需要的文件,而是使用写入w模式。这导致每个加密被附加到先前的数据以及第一个关系起作用但后续时间的原因。如果在每次加密后检查文件长度,将会发现正在发生的事情。

您需要使用:

$file = fopen("logs/2016-06-28.log", 'w');

来自php fopen docs

  

' w '仅限写作; 将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。

     

' a '仅供写作; 将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。在此模式下,fseek()无效,写入始终附加