2

紛らわしいタイトルで申し訳ありません。これがセキュリティ/暗号交換サイトのいずれかに属しているかどうかを考えていましたが、これは主にプログラミングに関する質問であるため、ここに投稿します. 自由に動かしてください!

AES 暗号化ストリームがあり、AES が元のデータにブロックを埋め込むため、結果として得られる暗号化されたデータは、ほとんどの場合、元の暗号化されていないデータとは異なるサイズになります。復号化するときは、暗号ストリームから読み取るバイト数 (暗号化されていないバイト数) を知る必要があります。私は当初、元の暗号化されていないデータ長をパケットで送信することを計画していましたが、別の方法を考えました。暗号ストリームから 4096 バイトを読み取り、実際に読み取られたバイト数を保存すると、正しいバイト数を新しい配列にコピーして使用できます。

それをしても安全ですか?私のコードは次のとおりです。

using (ICryptoTransform crypt = AES.CreateDecryptor())
{
    using (MemoryStream memStrm = new MemoryStream(data))
    {
        using (CryptoStream cryptStrm = new CryptoStream(memStrm, crypt, CryptoStreamMode.Read))
        {
            byte[] bytes = new byte[size];
            int read = cryptStrm.Read(bytes, 0, 4096);
            byte[] temp = new byte[read];
            Array.Copy(bytes, temp, read);
            return temp;
        }
    }
}

安全とは、つまり、常に正しい復号化されたデータを生成するということですか?

4

1 に答える 1

2

なぜあなたはそんなに多くの輪を飛び越えているのですか?MemoryStream、CryptoStream、一時配列...

return crypt.TransformFinalBlock(data, 0, data.Length);

暗号化を安全にするために、暗号文と一緒に保存された暗号化ごとにランダムな IV も使用する必要があります。また、encrypt-then-mac 構造に MAC (HMAC-SHA-256 など) を追加すると、パディング オラクルを含む多くの積極的な攻撃を防ぐことができます。

于 2013-02-14T08:12:56.513 に答える