2

This Answer from GregSのコメントによると、IV は AES 暗号化データの先頭に追加する必要があります (正しく読んでいると仮定します)。

暗号の前に置きます。そうすれば、ストリーミングモードで復号化できます。

GregS は、暗号化に使用される IV を自動的に付加/解析するストリーミング モードがあることを示唆しているように思えます。

これは本当ですか?

私は現在、IV を暗号化されたデータに手動で追加し、暗号を IV とデータに手動で分割してから復号化しています。これを自動的に行う方法はありますか?


参考のため:

これが私が今していることです:

Encryptメソッド:

public byte[] Encrypt(byte[] data)
{
    // Generate IV
    var iv = new byte[BlockSize/8];
    new Random().NextBytes(iv);

    byte[] cipher = // encryption happens here

    // Prepend IV to Cipher
    var saltedCipher = new byte[iv.Length + cipher.Length];
    Buffer.BlockCopy(iv, 0, saltedCipher, 0, iv.Length);
    Buffer.BlockCopy(cipher, 0, saltedCipher, iv.Length, cipher.Length);

    return saltedCipher;
}

Decryptメソッド:

public byte[] Decrypt(byte[] saltedCipher)
{
    // Split saltedCipher into iv and cipher
    var iv = new byte[BlockSize/8];
    var cipher = new byte[saltedCipher.Length - iv.Length];
    Buffer.BlockCopy(buffer, 0, iv, 0, iv.Length);
    Buffer.BlockCopy(buffer, iv.Length, cipher, 0, cipher.Length);

    byte[] data = // decryption happens here

    return data;
}
4

1 に答える 1

3

.NET フレームワークに組み込まれているメソッドだけを使用すると、自動的にデータの先頭に追加されることを知る方法はありません。これを処理する多くのサード パーティ製ライブラリがありますが、のライブラリはSystem.Security.Cryptography既定では処理しません。

多くの場合、情報を暗号化している場合、ファイルを復号化する前に知っておく必要があるすべての関連情報を含むヘッダーがあります。その情報は、ソフトウェアのニーズに応じて大きく異なります。あなたの簡単な例では、あなたのヘッダーはただです

╔════════════════╦══════════════╦═════════════════ ══╦═════════════╗
║ オフセット (バイト) ║ サイズ (バイト) ║ 暗号化ステータス ║ 説明 ║
╠════════════════╬══════════════╬═════════════════ ══╬═════════════╣
║ 0 ║ BlockSize/8 ║ 暗号化されていない ║ IV ║
║ BlockSize/8 ║ Var. ║ 暗号化 ║ データ領域 ║
╚════════════════╩══════════════╩═════════════════ ══╩═════════════╝

IV の長さなどの追加情報やファイルに関するメタデータは必要ない固定ブロック サイズであるため (私は想定しています)、これで十分です。

それを TrueCrypt コンテナーのようなより複雑なファイルと比較してください (元のサイトは仕様ではもう存在しませんが、このミラーを見つけました)

╔════════════════╦══════════════╦═════════════════ ═══════════╦══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════════╗
║ オフセット (バイト) ║ サイズ (バイト) ║ 暗号化ステータス ║ 説明 ║
╠════════════════╬══════════════╬═════════════════ ═══════════╬══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════════╣
║ 0 ║ 64 ║ 暗号化されていない§ ║ ソルト ║
║ 64 ║ 4 ║ 暗号化 ║ ASCII 文字列 "TRUE" ║
║ 68 ║ 2 ║ 暗号化 ║ ボリューム ヘッダー フォーマット バージョン (5) ║
║ 70 ║ 2 ║ 暗号化 ║ ボリュームを開くために必要な最小プログラム バージョン ║
║ 72 ║ 4 ║ 暗号化 ║ (復号化された) バイトの CRC-32 チェックサム 256-511 ║
║ 76 ║ 16 ║ 暗号化 ║ 予約済み (ゼロを含める必要があります) ║
║ 92 ║ 8 ║ 暗号化 ║ 隠しボリュームのサイズ (非隠しボリュームではゼロに設定) ║
║ 100 ║ 8 ║ 暗号化 ║ ボリュームのサイズ ║
║ 108 ║ 8 ║ 暗号化 ║ マスター鍵スコープの開始のバイトオフセット ║
║ 116 ║ 8 ║ 暗号化済み ║ マスター鍵スコープ内の暗号化領域のサイズ ║
║ 124 ║ 4 ║ 暗号化済み ║ フラグ ビット (ビット 0 セット: システム暗号化、ビット 1 セット: 非システム インプレース暗号化/復号化ボリューム、ビット 2 ~ 31 は予約済み) ║
║ 128 ║ 4 ║ 暗号化 ║ セクター サイズ (バイト単位) ║
║ 132 ║ 120 ║ 暗号化 ║ 予約済み (ゼロを含める必要があります) ║
║ 252 ║ 4 ║ 暗号化 ║ (復号化された) バイトの CRC-32 チェックサム 64-251 ║
║ 256 ║ Var. ║ 暗号化 ║ 連結されたプライマリおよびセカンダリ マスター キー** ║
║ 512 ║ 65024 ║ Encrypted ║ Reserved (システム暗号化の場合、この項目は省略されます‡‡) ║
║ 65536 ║ 65536 ║ 暗号化/非暗号化§ ║ 隠しボリューム ヘッダーの領域 (ボリューム内に隠しボリュームがない場合、この領域にはランダム データが含まれます††)。システム暗号化の場合、この項目は省略されます。‡‡ バイト 0 ~ 65535 を参照してください。║
║ 131072 ║ 変数。║ 暗号化 ║ データ領域 (マスター キー スコープ)。システム暗号化の場合、オフセットは異なる場合があります (システム パーティションのオフセットによって異なります)。║
║ S-131072‡ ║ 65536 ║ 暗号化/非暗号化§ ║ バックアップ ヘッダー (別のソルトを使用して派生した別のヘッダー キーで暗号化)。システム暗号化の場合、この項目は省略されます。‡‡ バイト 0 ~ 65535 を参照してください。║
║ S-65536‡ ║ 65536 ║ 暗号化/非暗号化§ ║ 隠しボリュームのバックアップ ヘッダー (別のソルトを使用して派生した別のヘッダー キーで暗号化)。ボリューム内に隠しボリュームがない場合、この領域にはランダム データが含まれます。†† システム暗号化の場合、この項目は省略されます。‡‡ バイト 0 ~ 65535 を参照してください。║
╚════════════════╩══════════════╩═════════════════ ═══════════╩══════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ ════════════════╝

* オプションのクイック フォーマットとダイナミックが無効であり、ボリュームに暗号化されたファイル システムが含まれていない場合 (TrueCrypt では、ユーザーがそのようなボリューム内に隠しボリュームを作成できないことに注意してください)。
† ボリューム ヘッダーの暗号化された領域は、プライマリ ヘッダー キーとセカンダリ ヘッダー キーを使用して XTS モードで暗号化されます。詳細については、「暗号化スキーム」セクションと「ヘッダー キーの派生、ソルト、および反復回数」セクションを参照してください。
‡ S は、ボリューム ホストのサイズ (バイト単位) を示します。
§ 秘密にしておく必要がないため、ソルトを暗号化する必要がないことに注意してください [7] (ソルトはランダムな値のシーケンスです)。
** ボリュームが暗号のカスケードを使用して暗号化されている場合、複数の連結されたマスター キーがここに保存されます (セカンダリ マスター キーは XTS モードで使用されます)。
†† ボリュームの作成時に空きボリューム領域をランダム データで埋める方法については、このセクションの上記を参照してください。
‡‡ ここで、「システム暗号化」の意味には、隠しオペレーティング システムを含む隠しボリュームは含まれません。

そのため、ヘッダーのニーズは非常に多様であるため、.NET フレームワークは開発者に独自の設計を任せています。

于 2014-07-25T19:26:14.193 に答える