1

我有一个小问题,我使用“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');
    }
}
4

2 回答 2

2

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

您正在以附加模式打开要写入的文件,这不是您需要的,而是使用写入w模式。这导致每个加密都附加到先前的数据以及第一个领带起作用但随后的时间的原因。如果您在每次加密后检查文件长度,就会清楚发生了什么。

你需要使用:

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

来自php fopen 文档

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

' a ' 只供书写;将文件指针放在文件末尾。如果该文件不存在,请尝试创建它。在这种模式下, fseek() 没有效果,写入总是被追加

于 2016-06-28T15:26:59.010 回答
2

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

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

或者你可以简单地使用类似的东西file_get_contents()来获取整个文件的内容,然后解密。

于 2016-06-28T15:18:32.733 回答