0

私が取り組んでいる s3fs-fuse のフォークがあります。私の仕事は、ファイルを RC4 で透過的に暗号化することです。FdEntity::Read および Write 関数 (fdcache.cpp にあります) に暗号化を追加しましたが、jpeg ファイル (17kb) をコピーしようとすると失敗します (ファイルはコピーされますが、画像は破損しています)。 cmp では、4096 バイト以降のファイルが異なります。ただし、198kb のテキスト ファイルはエラーなしでコピーされます。

私が知っていることは次のとおりです。4kbはブロックのサイズです。
ただし、s3fs は 20MB になるまで「マルチパート モード」になりません。それでも、マルチパートを無効にしました-o nomultipart(私も使用してい-o direct_ioます)。
したがって、おそらくマルチパートアップロードが原因ではありません。

4kb の後に jpeg ファイルでのみ何がトリガーされているのか、何か考えはありますか? バイナリとテキストのファイルに関連している可能性はありますか?

4

1 に答える 1

0

私はそれを考え出した。RC4 を使用してデータを部分的に復号化する場合、各部分のサイズは、エンコードされたときと同じでなければなりません。ただし、Read が引数として受け取ったサイズは、Write が受け取ったサイズよりも大きかった (Read は 20480 バイトを読み取るように要求され、Write は 4096 バイトに制限された)。したがって、データの 20480 バイト セクション全体を読み取ろうとすると、暗号化は失敗します。私の解決策は、さらに読むように求められたとしても、読み取った量を 4096 に固定することでした。S3fs は、補正のために関数を追加で自動的に呼び出します。このソリューションは技術的に完全ではない可能性があります。データのすべての非最終セクションが書き込みによって 4096b ブロックで暗号化されたという保証はなく、最終セクションが常に特定のサイズ (合計サイズ モジュロ 4096) でそのアライメントで暗号化されたという保証もありません。 )。でも、

テキストファイルは同じ文字列が何度も繰り返されていたため、問題はテキストファイルではなく jpeg でのみ発生しました。

于 2016-04-19T15:11:41.907 に答える