我有一个小问题,我使用"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');
}
}
也许问题是您正在尝试附加额外的加密数据,这通常不会工作,有几个原因,一个主要的是AES是基于块的,很可能会有填充。许多模式使用某种形式的链接,这在附加加密数据时也会失败。
您正在以追加模式打开您要写入的文件,这不是您需要的,而是使用写入w
模式。这导致每次加密都被附加到以前的数据上,这也是第一次加密有效的原因。如果在每次加密后检查文件长度,就会清楚发生了什么。
你需要使用:
$file = fopen("logs/2016-06-28.log", 'w');
From php fopen docs:
'w'只允许写入;将文件指针放在文件的开头,并将文件截断为零长度。如果文件不存在,尝试创建。
'a'只允许写入;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。在这种模式下,fseek()不起作用,写入总是附加。
我不会使用fgets()
,因为它一次只能从文件中获取一行,并且您不能拆分加密字符串并一次解密单个片段。
您可以使用fgets()
,但您需要读取所有内容并将其存储在变量中,然后在您解密所有内容后。
或者您可以简单地使用file_get_contents()
之类的东西来获取整个文件的内容,然后解密