私は、パスワードを使用してレコードのファイルの機密性、整合性、および信頼性を保護する必要があります。レコードの数は潜在的に32^2を超える可能性があり、各レコードに個別にアクセスできます。
それを実装する1つの方法は
- 256ビットのランダムソルトを生成し、ファイルヘッダーに保存します。
- PKCS#5のHMAC-SHA256でPBKDF2を使用して、パスワードとソルトから派生キーを生成します。
- レコードごとに、96ビットのランダム初期化ベクトルを生成します。
- 派生キー、初期化ベクトル、および(追加の認証済みデータとして)ファイル内のレコードの位置を使用して、GCMモードでAES-256を使用して各レコードのコンテンツを暗号化します。
- その結果、各レコードには、初期化ベクトル、暗号化されたコンテンツ、およびMACが格納されます。
ただし、GCMとGMACを定義するNIST Special Publication SP800-38Dでは、初期化ベクトルを一意にするために、レコード数を32^2未満にする必要があります。
そこで、別の解決策を考案しました。派生キーをキーとして使用し、ファイル内のレコードの位置を認証(ソルト)するメッセージとして使用して、HMAC-SHA256で各レコードのキーを作成します。
したがって、問題は、キーを生成するときにすでに処理しているので、ファイル内のレコードの位置を追加の認証済みデータとして認証済み暗号化アルゴリズムに提供する必要があるかどうかです。
さらに、HMAC-SHA256(PBKDF2(HMAC-SHA256、password、salt、iterationCount、256)、blockAddress)によって生成されたと思われる異なるキーを使用してすべてのレコードが暗号化および認証されるため、本当に初期化ベクトルを使用する必要がありますか?
ファイルのサイズがわからないので、非常に大きくなる可能性があると思います。