PHP を使用して「オンザフライ」でファイルを復号化しようとしています。私は mdecrypt_generic 関数を使用しており、ファイル全体を一度に復号化するのではなく、チャンクでファイルを復号化しています。復号化しようとしているファイルは、リモート サーバーでホストされています。cURL を使用してファイルをチャンクで取得し、各チャンクを復号化して出力します。これは、最初のチャンクから始めるとうまくいきます。しかし、別のチャンク (たとえば 2 番目) から開始すると、mdecrypt_generic はそのチャンクに対して別の結果を返します。現在、PHP マニュアルには、すべての mdecrypt_generic 呼び出しの前に、暗号化バッファーを再初期化する必要があると記載されています。ただし、これを行うと、最初のチャンクを除くすべてのチャンクを復号化できないため (最初のチャンクから始めても)、さらに悪化します。私のコードは次のようになります。
$td = mcrypt_module_open('rijndael-128', '', 'ctr', '');
$init = mcrypt_generic_init($td, $key, $iv);
foreach($chunks as $chunk=>$size){
$data = get_chunk($chunk,$size);
echo mdecrypt_generic($td, $data);
}
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
前述したように、mdecrypt_generic 呼び出しのたびに暗号化バッファーを再初期化しません。
編集 1 (問題が見つかりました): 問題 は見つかりましたが、解決策は見つかりませんでした。問題は、ファイルがチャンクで復号化されていることでした。これは、現在の位置が記述子 ($td) によって記憶されていることを意味します。ただし、最初のチャンクから開始せずにファイルを復号化したいのですが、そのためには記述子を変更する必要がありますが、私が知る限り、そのようなオプションはありません。私が使用する「一時的な」解決策は、正しい記述子の位置を取得するために、長さが前のチャンクに等しいランダムデータの復号化から始めます。ただし、一部のファイルは非常に大きいため、これは限定的なソリューションです。
編集 2 (解決策が見つかりました): ファイルは ctr モードで暗号化されています。$iv (初期値) はカウンターのようなものであり、各チャンクの復号化後に増加する必要がありました。