2016-06-28 9 views
1

"openssl_encrypt"を使用してHTMLを含む文字列を暗号化し、その文字列をファイルに書き込み、次に別のページ、私は "openssl_decrypt"を使ってファイル全体を解読しています。私は同じ暗号鍵、同じ方法、同じivを必ず使用しました。私はこれが、暗号化の初心者のように、私が見ることができないものだと思います。助けをよろしくお願いします。ここで文字列を暗号化してファイルに書き込み、PHPでファイルを復号する

は、いくつかのサンプルコードです:

//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'); 
    } 
} 
+0

私のために働きます。 'echo $ decrypt;'を追加し、 'logs/2016-06-28.log'を読み書きできることを確認してください。 –

+0

ファイルを暗号化しているだけの場合、XTSは最良の暗号化モードではありません。 XTSは、セクタごとのディスク暗号化のために設計されています。 – zaph

+0

E_pの場合、暗号化と復号化は別々のページで行われます。そして、ファイルは上書きされ、読み込まれます。 –

答えて

2

おそらく問題は、暗号化されたデータを追加しようとしていることです。これは、一般的にいくつかの理由で機能しません。AESがブロックベースであり、パディングが多いという主な理由があります。多くのモードでは、何らかの形式の連鎖が使用され、暗号化されたデータを追加するときにも失敗します。

書き込みモードで書き込みしようとしているファイルを開いています。これは必要ではありません。代わりにwrite wモードを使用してください。これにより、各暗号化が前のデータに追加され、その理由は最初の結合は機能しますが、その後の時間は機能します。各暗号化後にファイルの長さを調べると、何が起きているのかが明らかになります。

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

php fopen docsから:あなたが使用する必要が

開く 'ワット '

だけ書き込むため。 ファイルポインタの先頭にファイルのを置き、ファイルをゼロ長に切り捨てます。ファイルが存在しない場合は、作成してください。

'a'書き込み専用です。 ファイルの末尾にファイルポインタを置きます。ファイルが存在しない場合は、作成してください。このモードでは、fseek()は効果がありません。の書き込みは常にに追加されます。

+0

これは、ファイルを開くときにファイルを切り捨てるたびに、1つのログエントリをファイルに保持します。だからあなたが最後のエントリを見たいと思っている限り、これは正常に動作します。 – Pitchinnate

+0

ありがとう!これは正しい経路に私を置く! :) –

2

それが唯一のファイルから単一の行を取得するように私は一度にfgets()を使用していないだろうし、あなたが暗号化された文字列を分割し、単一の部分を解読することはできません一度に。

fgets()を使用できますが、すべてを読み込み、変数に格納してからすべてを解読する必要があります。

また、file_get_contents()のようなものを使用して、ファイルの内容全体を取得して解読することもできます。

+0

あなたの答えをありがとう!私はもともと 'file_get_contents()'を使ってみましたが、まだ復号化に失敗します。解読はファイルに書き込まれた最初の文字列で完全に実行されますが、その後ファイルに書き込まれる文字列では解読が失敗し、さまざまなシンボルが表示されます。 –

+1

それはできないからです。暗号化されたファイルにデータを追加して一度に復号化することはできません。 そうしたい場合は、行単位で読み込み、それぞれの行を別々に解読する必要があります。ただし、文字列に改行が含まれる場合は、ファイルに改行があります。別々のエントリをファイルと区別するために、改行以外の方法が必要になります。 – Pitchinnate

関連する問題