2012-01-01 22 views
3

私は256ビットの鍵を持つcbcモードのAESで暗号化方式を作成しています。私がCBCのモードと初期値を知る前に、私は暗号化と塩の保管のそれぞれのために32ビットの塩を作ることを計画していました。パスワード/入力されたキーは、32ビットまでこの塩で埋められます。鍵の塩と初期値AES

ie。入力されたパス/キーが「木」の場合、28 0で埋められるのではなく、この塩の最初の28文字で埋められます。

しかし、これは私が静脈を知る前のことであり、いくつかの場所では塩とも呼ばれていました。私の問題は、これまでのこの塩漬けの方法がIVと原則的に重複しているかどうかということになっています。これは、塩と象牙が暗号文と一緒に保存され、理論的なブルートフォース攻撃が抑止されないと仮定することであろう。

このキーを保存し、それを0よりもむしろ使用することは、何らかの努力が必要なステップなので、実際には役に立たない措置であるかどうかを尋ねる価値があります。現在の知識で、AES用の任意の強力な復号化テーブルを作ることができるようではなく、16ビットの塩でさえmd5テーブルの作成に苦労します。

おかげで、 エリヤ

答えて

8

ECBモードの暗号化(認証モードGCMやEAXなどの優れたモードもありますが)よりも確かに優れているので、CBCを知っておきましょう。あなたが知っておくべきことがいくつかあると思いますので、ここで説明します。


キーとパスワードが同じではありません。通常、キー導出関数を使用して、パスワードから対称暗号化に使用される鍵を作成します。 PBKDF2(パスワードベースの鍵導出関数#2)は、PBE(パスワードベースの暗号化)に使用される最も一般的なものです。これは、RSAラボで公開されている最新のPKCS#5標準で定義されています。パスワードを入力する前に、パスワードがバイト(文字エンコーディング)に正しく変換されているかどうかを確認する必要があります。

この塩は、キー導出関数の別の入力として使用されます。特定のパスワードに対してキーが事前計算されている「虹のテーブル」を使用してブルートフォース攻撃を防止するために使用されます。塩のために、攻撃者は、塩ごとに1つを生成することができないので、事前に計算された値を使用することはできません。塩は、通常、16バイト(128ビット)以上でなければなりません。また、同一のパスワードが同じ派生結果を持たないようにします。

キー導出関数の出力は、dkLenバイトのシークレットです。ここで、dkLenは、生成するキーの長さ(バイト)です。 AESキーにはこれらのバイト以外は含まれていないため、AESキーは生成された秘密キーと同じになります。 dkLenは、AESのキー長が128,192、または256ビットの場合は、16,24、または32バイトでなければなりません。


これで、最終的に使用するAESキーがあります。ただし、このキーで各プレーンテキストブロックを単純に暗号化すると、プレーンテキストブロックが同一であれば同じ結果が得られます。 CBCモードは、暗号化を行う前に、次のプレーンテキストブロックを最後の暗号化ブロックと排他的論理和(XOR)することによってこれを回避します。最後に暗号化されたブロックが「ベクトル」です。最後に暗号化されたブロックがないため、これは最初のブロックでは機能しません。このため、最初のベクトル、「初期化ベクトル」またはIVを指定する必要があります。

AESのブロックサイズは、鍵サイズのからまでの16バイトです。したがって、初期化ベクトルを含むベクトルも16バイトである必要があります。たとえば、キーを使用して暗号化する場合にのみ、 1つのファイルであれば、IVは単に値00hの16バイトを含むことができます。ファイルに同じテキストが含まれていると、暗号化されたファイルの最初の部分が同一であることを検出できるため、複数のファイルでは機能しません。このため、キーを使用して実行する暗号化ごとに異なるIVを指定する必要があります。固有で16バイトであり、解読を実行するアプリケーションに知られている限り、その内容には関係ありません。

ここでは、IVにすべてのゼロを常に使用できるトリックがあります.AES-CBCを使用して暗号化したプレーンテキストごとに、同じパスワードで異なる塩を使用してキーを計算できます。その場合、結果のキーは単一の情報にのみ使用されます。これは、パスワードベースの暗号化を実装するライブラリにIVを提供できない場合には、良い考えです。しかし、CPUは不公平です.PBKDF2の機能は意図的にCPUには不公平です。


IVと塩は、しばしば混乱しますが、完全に別個の用語です。あなたの質問では、ビットとバイト、鍵のサイズとブロックサイズ、そしてレインボーテーブルをMD5テーブルと混同します(暗号化は簡単だと誰も言わない)。 1つのことは確かです。暗号化では、できる限り安全であることが求められます。本当に(本当に)余分なリソースを買う余裕がない限り、冗長セキュリティは一般的に問題ではありません。


これがどのように機能するかを理解すると、真剣にPBE暗号化を実行するライブラリを見つけることができます。パスワード、塩分、平らなデータ、そして別に設定されている場合はIVを入力する必要があります。

+0

私はこの時点でAES暗号化を理解するようになりましたので、あなたの答えは少し長いです。私が言葉を混乱させるならば、それは単に表現の怠け者/誇りからだけです。私は冗長なセキュリティについて同意するようになり、塩を使用します。 – user1122069

+2

あなたの質問に対処するにはいくつかの問題があり、人々の心を見ることができないので、時間がかかりました。さらに、同様の質問をした人を助けるかもしれません。とにかく1分に300文字以上を入力してください(良い日に)。 –

+0

@MaartenBodewesようやく私は何時間ものグーグルで塩とIVが何であるか理解しました。 IVのサイズは、CBC連鎖モードでは常に16バイトです。 –

0

あなたはAES-CBCについて話している場合、それは、塩の初期化ベクトル(IV)ではありません。カプセル化されたメッセージの最初のブロックとしてIVをクリアに送信するのが一般的な方法です。 IVは秘密にする必要はありません。ただし、すべてのメッセージで変更する必要があります。一定のIVは、最初のブロックがECBモードで暗号化されていることを意味します。

+0

真実ですが、私の質問は、32ビット未満であれば、パディングするのではなくキーを塩害する必要があるかどうかということでした。 ivと考えられる塩はランダムであり、すべてのメッセージとともに保存されます。 – user1122069

+0

@ user1122069 AESのキーは、128,192、または256ビットでなければなりません。ここでは、ユーザーが入力したパスフレーズをキーに変換するキー導出関数について説明していますか? – rossum

+0

はい、iv。 – user1122069