3

暗号化されたビデオのストリーミング中に位置に「スキップ」したい場合、この問題が発生します

だから私が持っているのは:

http ストリーミング サーバー (ローカル、Android デバイス上で実行) ネイティブ android Media Player RC4 暗号化ユーティリティ

基本的に、暗号化されたビデオを SD カードに保存しています。http ストリーミング サーバーを使用してメディア プレーヤーにストリーミングしたいと考えています。サーバーはすでにオンザフライで暗号化を行っていますが、これは実際に機能し、OutputStream に書き込む前に RC4 暗号化ユーティリティを使用してバイトを変換します。

ファイルの暗号化は問題ありません。生成された暗号化ユーティリティのビットに対してファイル全体を実行するだけです。これは、ビデオを再生しようとするときにやり直すだけです。問題は、ビデオの位置を「シーク」したい場合です。たとえば、2 時間の映画の中間部分を表示したい場合です。私が現在行っていることは、非常にゆっくりではありますが、RC4 暗号化ユーティリティをリセットし、ビデオでジャンプした時間と同じ量をフィードすることです。

ここでの説明があまり明確に聞こえない場合はご容赦ください。ただし、実際にストリーミングで RC4 暗号化を使用していた場合は、同じ問題に遭遇するはずです。

問題は、それが可能かということです。可能であれば、スキップした不要なバイトをすべて通過せずに、RC4 ビット ジェネレーターの位置を「シーク」するにはどうすればよいでしょうか。

各ビデオのサイズは約 500 MB 程度なので、ビデオの最後近くまでシークすると、正しいデータをストリーミングできるようになるまでに約 5 億回の無駄なビット反復が必要になります。

4

1 に答える 1

5

いいえ、RC4 アルゴリズムはシークできません。キー ストリーム生成の各反復では、2 つの要素のステートフル スワップを使用して、キーに依存する S 順列を並べ替えます。これは、すべての中間スワップを実際に実行しないと再現が難しい方法です。

CTR モードは完全にシークできるように設計されているため、たとえばCTR モードでAES を使用していれば、目的を達成するのは簡単なことでした。

編集: ただし、メモリが不足していない場合にできることの1つは、独自のRC4実装を使用し(リンクを参照、簡単に実行できます)、内部状態(各位置で合計258バイト)を定期的にキャッシュすることです間隔。これは、ユーザーが頻繁に前後にジャンプしている場合に役立ちますが、ユーザーが最初にスキップしたときに、完全な RC4 キー ストリームをその位置に生成する必要があります。

于 2012-03-06T08:21:34.160 に答える