AES暗号化を使用する場合は、平文を暗号ブロックサイズに埋め込む必要があります。ほとんどのライブラリと標準では、パディングバイトはパディングされていない平文の長さから判断できます。可能であれば、ランダムパディングバイトを使用する利点はありますか?AES暗号化でランダムなデータをパディングする利点はありますか?
私は、機密ユーザーごとおよびセッションごとのデータを保存するための体系を実装しています。データは通常、JSONでエンコードされたキーと値のペアであり、潜在的に短くて繰り返し可能です。私は指導のためにPKCS#5を探していますが、DES3ではなく暗号化アルゴリズムにAESを使用する予定です。私はデータ項目ごとにランダムなIVと、ユーザーIDとパスワードまたはセッションIDで決まるキーを適切に計画していました。
私が驚いたことの1つは、平文のPKCS#5パディングスキームです。暗号文を8バイトブロックにパディングするには、最後に1~8バイトが追加され、パディングバイトの内容はパディングバイト数(すなわち、01
、0202
、030303
、最大で0808080808080808
)に反映されます。私自身のパディングスキームは、平文の前にランダムなバイトを使用し、平文の最後の文字は追加されたパディングバイトの数になります。
私の推論は、AES-CBCモードでは、各ブロックが前のブロックの暗号文の関数であるということでした。このように、各平文にはランダム性の要素があり、既知の平文攻撃やIVや重要な問題から別の保護層を得ることができます。私の平文は短いと予想されるので、解読された文字列全体をメモリに保持し、前後のパッドをスライスすることは気にしない。
1つの欠点は、同じ暗号化されていない平文、IV、およびキーが異なる暗号文を生成し、単体テストを困難にすることです(不可能ではありません - テスト用に疑似ランダムパディングジェネレータを使用できます。製造)。
ランダムパディングを強制するには、最小2バイト、つまり1つのカウントと1つのランダムバイトを追加する必要があります。確定的なパディングの場合、最小値は1バイトで、平文または暗号文ラッパーに格納されます。
PKCS#5のようなよく知られている標準では、確定的なパディングを使用することに決めたので、私が見逃したことがあるのか、それともあまりにも高いと判断しています。
優れた点。キーとIV側の暗号品質の乱数を保存すると思います。私はキーの導出のためにPBKDF2を見ていますが、SHA-1を使用しています。 – jwhitlock
PBKDF2は設計上差し替え可能です。原則としてSHA-256(またはそれが何であるか分かるとSHA-3)などのより強力なものを使用することができます。もちろん、個々のPBKDF2実装では、使用する擬似乱数関数を指定することができない場合があります。 –
私は、別のハッシュ関数を使うことができるPython(http://www.dlitz.net/software/python-pbkdf2/)用のPBKDF2パッケージを使いました。私はSHA-256を使っています。 いくつかの実験の後で、圧縮とPKCS#5スタイルのパディングを使用して、キー側の強力な乱数ジェネレータを保存して、うれしく思います。 – jwhitlock