0

ファイルの暗号化に CryptoStream を使用する際に問題が発生しました。

コード:

public static void EncryptFile(string inputFile, string outputFile)
    {
        int num;
        string s = "PUPlr";
        byte[] bytes = new UnicodeEncoding().GetBytes(s);
        string path = outputFile;
        FileStream stream = new FileStream(path, FileMode.Create);
        RijndaelManaged managed = new RijndaelManaged();
        CryptoStream crpytStream = new CryptoStream(stream, managed.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
        FileStream stream2 = new FileStream(inputFile, FileMode.Open);
        while ((num = stream2.ReadByte()) != -1)
        {
            crpytStream.WriteByte((byte)num);
        }
        stream2.Close();
        crpytStream.Close();
        stream.Close();
    }

「managed.BlockSize = 16;」を試す または「= 128;」うまくいかないようですが、どうすればエラーを修正できますか?

4

4 に答える 4

4

Rijndael のようなブロック暗号には、ブロック サイズ (通常は 256 ビット) に等しい長さの鍵と IV が必要です。

さらに、IV はメッセージごとに一意である必要があり、そうでない場合、データは安全ではありません。

于 2012-04-25T19:47:36.093 に答える
2

エラーは次のとおりです。

managed.CreateEncryptor(bytes, bytes)

ここで、最初の(Key)およびbytes2番目のパラメーターは128ビット(16バイト)、192ビット(24バイト)、または256ビット(32バイト)のいずれかである必要があります。

ノート:

  • AESの相互運用性については、128ビット(16バイト)で使用Rijndaelする必要があります。BlockSize

  • UnicodeEncoding(多くの場合)弱いパスワードを与えます。PKCS#5を使用して、パスワードから強力なキー(およびIV)を作成する方法を検討してください。.NETについては、RFC2898DeriveBytesを参照してください。

  • キーとIVの両方に同じデータを使用することは避けてください。

于 2012-04-25T19:52:52.113 に答える
0
public static void EncryptFile(string input, string output)
{
    string theKey = "urKey";
    byte[] salt = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(theKey, salt);
    RijndaelManaged RMCrypto = new RijndaelManaged();
    using (var inputStream=new FileStream(input))
        using (var outputStream = new FileStream(output))
            using (CryptoStream cs = new CryptoStream(inputStream, RMCrypto.CreateEncryptor(pdb.GetBytes(32), pdb.GetBytes(16)), CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[1024];
                int bytesRead = 0;
                do
                {
                    bytesRead = cs.Read(buffer, 0, buffer.Length);
                    outputStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
            }
}
于 2012-04-25T20:47:49.770 に答える
0

この行は次のとおりです。

managed.CreateEncryptor(bytes, bytes)

うまくいきません。最初のパラメーターはキーで、2 番目のパラメーターは初期化ベクトルです。s文字列を「パスワード」またはキーとして使用するつもりだった場合は、 を使用しRfc2898DeriveBytesてパスワードからキーを生成してみてください。

于 2012-04-25T19:49:09.423 に答える