2016-08-03 7 views
0

AESでデータを暗号化するときにIV(初期化ベクトル)を正しく使用することがわかりません。Python:AESでの暗号化と復号化に同じIVを使用する

ランダムに生成されたIVをどこに格納するかはわかりません。スクリプトでは、データは暗号化されてファイルに保存され、プログラムは終了します。次のセッションでは、以前に保存したデータを復号化する必要があります。私のIVの理解が正しいなら、私は暗号化と同じIVを復号化に使用しなければならない(しかし、すべての単一の暗号化プロセスのための別のランダムIV)。 したがって、IVをどこかに保存する必要があります。暗号化されたデータに先行することをお勧めする人もいますが、私の場合は正しく動作しません。を復号できるようにIV が必要です。それ。

これが正しいのですか、それとも私は何かを誤解しましたか?暗号化された/ハッシュされたキーとIV(暗号化されていなくても)を暗号化されていないプレーンテキスト設定ファイルや何かの中に保存しないようにしたい。

+1

* *「何人かの人々は、暗号化されたデータにそれを先頭に追加をお勧めしますが、私は右のそれを得る場合には、私の場合には動作しません」 - 私はエラーがここにあると思います。それがまさにそれが機能しなければならない理由です。おそらく、暗号文の前部からIVを読んで、それをスキップして解読するのを忘れていたでしょう。 –

+0

私はそれがポイントだと思います。私はIVが暗号文の内部に統合されていると想定していました。あなたが書いているように、そうではありません。暗号文が生成された後は明らかに**付加されているので、解読の際に読み取ることができます。すべてのものが保存されているファイルの種類は明らかに変更されていません(例えばtxtやxmlなど)。これはIVの読み込みを容易にします。私が読んだチュートリアルで遭遇した.encファイルタイプが混乱していました。私はそれを解読する前に.encファイルを読むことは不可能だと思った。 – Boandlkramer

答えて

0

IV自体は機密データではありません。最初の暗号テキストブロックの状態をスクランブルするために使用され、スクランブリングはIV自体から回復できません(キーは「秘密」要因を追加します)。

「適切な」連鎖モードの場合、IVは暗号テキストとは別物です(暗号化と復号化の両方に初期IVが必要)ので、別々に保管して別々に暗号ライブラリAPIに渡す必要があります。暗号化の後、好きなようにIVを保存することができます - それを失うことはありません。

暗号文に「前書き」/「追加」することができますので、データの1つのまとまりを保存するだけで済みますが、復号化前に分割する必要があります期待する。

暗号化ライブラリAPIがネイティブIVをサポートしていないにもかかわらず、連鎖をサポートしている場合は、暗号化する前にプレーンテキストにランダムなデータブロックを1つ追加するだけです。この場合、個別に格納するIVはありません。単純にIV +メッセージバイナリペア全体を暗号化するだけで、データの復号後に最初のブロックを削除するだけです。あなたが前に追加する "ランダムなデータ"は、実際のIVと同じ制約を持っています(同じランダムなデータを同じキーで再利用しないなど)。

APIレベルでは2つのアプローチが意味的に異なりますが、実際の暗号化への影響は同じです(実際のペイロードの最初のブロックを予測できないようにスクランブルします)。

IVがどのように使用されるかについては、考えられる方法が多数あります。実際に別々に格納されているときにIVをさまざまな連鎖モードでどのように使用できるかを示す便利な図は、ブロック連鎖に関するwikipediaの記事を参照してください。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

+0

リンク専用の回答は答えではありません。 –

+0

ありがとう!私はこのように私の記憶の問題をどうにかして解決する必要があります、あなたは上記の "暗号化のパラドックス"について説明できますか?たとえば、暗号化されたデータにIVを保存することをお勧めする人もいますが、これは私の視点では不可能なすべてを解読することになります。スクリプトを再起動すると、必要なIVが暗号化されますが、そのためIVを保存することをお勧めしますか? 編集:ああ、私は@Artjom B.のコメントを逃した。私は彼が私の誤解を理解したと思う。 – Boandlkramer

+0

答えを拡張して、単なるリンクではありませんでした。 – solidpixel