2009-08-23 10 views

答えて

2

Seekの操作は、ECBスタイルの連鎖(つまり、ブロックを別々に暗号化する)で一定時間(アルゴリズムによっては比較的)実行でき、highly unrecommended - see the image in this Wikipedia article for a startling example of insecurityだからこそ有用ではないと思います。

私には、MemoryStreamまたは類似のラッピングテクニックに/からコピーする方が良いと思われます。

+0

問題が表示されます。しかし、TrueCryptで使用されているような、ブロック単位の安全な暗号化を可能にするいくつかのアプローチがあります。たとえばhttp://en.wikipedia.org/wiki/Disk_encryption_theory#XTSです。 –

+1

ディスク暗号化は、各ブロックを独立して暗号化します。つまり、ランダムにシークする方法です。 –

4

ブロック単位の暗号化は完全に安全です。問題はECBだけです。インプリメンテーションは、おそらくOFBモードまたはCTRモードのいずれかを使用して記述することができます。しかし、私はそれを見つけることが決してなかった。弾丸をかむと、それを書くことがあります...

UPDATE:

だから私はこれの実装を書きました。いろいろな理由で私は今ここに投稿するつもりはありませんが(私はいつかしようとしますが)、これを行う人のためのいくつかの指針があります:

RijndaelManagedトランスフォームをCBCモードで使用してください。あなたはブロックごとに暗号ストリームを計算するつもりです。これを行うには、変換でキーと空の(すべてゼロ)ivを初期化します。実際のivはブロック単位で計算されます。

nonce plus iv plus counterを連結または計算することによって、現在のブロックへの入力を計算する方法が必要です。 nonce &を事前に計算するなど、いくつかの最適化を行うことができます(このメソッドは何度も呼び出されるため、おそらくそれに相当します)。

(注:ここで「iv」とは、NISTがIVと呼ぶ、ブロック全体の中央部分で、他の人が呼び出すものを意味します。

このメソッドは、データを暗号化しているループ内で使用します。これを初めて呼び出すとブロックの境界で呼び出し、現在の暗号ストリームを更新します。このメソッドは、トランスフォームのTransformBlockメソッドへの入力を提供します。トランスフォームからの出力を取り出し、その結果を現在のデータブロックとXORします。各ブロックが暗号化されたら、transform.Reset()を使用してください!それ以外の場合、CBCはトランスフォームからの出力を次の入力への入力として使用しようとします。 .NETでこれを行うより巧妙な方法があるかもしれませんが、私はそれを理解することはできません。私はBouncyCastleがOFBを "ネイティブ"にサポートしているので、より良い選択肢かもしれませんが、これは外部デープなしで再利用可能な暗号ストリームを得る素早い方法です。

とにかく、この全メソッド(私はそれをAesCtr256.Processと呼んでいますが、より一般的である可能性があります)は、暗号ストリーム内の任意の範囲のデータで機能します。このメソッドは、カスタムStreamクラス内で簡単に使用できます。これにより、読み込みと書き込みの両方でストリーム内の任意の場所にシーク​​できるようになり、実際のデータ長を実際に報告する暗号ストリームを持つことができるようになります。

別の言い方をすれば、ストリームの任意の部分の暗号ストリームを計算し、単純に暗号または平文に対してxorまたは暗号化/復号化することができます。

2つの最後のもの:1。)私はストリームの生活のためにトランスフォームを再利用することを強くお勧めします - これらは高価です。あなたがこれを実装しようとしている場合は、NISTベクトルまたは同様のに対してユニットテストを書いてください。あなたがこの権利を持っていると仮定しないでください。出力がランダムに見えるので、正しく暗号化されているわけではありません。

誰かがより良いアプローチについて考えているか、本当に重要なコードを手に入れたことがあれば、ありがとう!

関連する問題