Ошибка о заполнении происходит во время моей попытки расшифровать строковые данные из FileStream с помощью Rijndael - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь зашифровать некоторые строки (фактически обходной путь для шифрования объекта XElement) в файл с использованием Rijndael.Однако при расшифровке выдается CryptographicException с сообщением « Заполнение недопустимо и не может быть удалено ».Я искал несколько сообщений для возможных решений, в которых кто-то упоминает PaddingMode, метод FlushFinalBlock() и другие.Также кто-то упоминал, что это потому, что чтение непосредственно из FileStream установит длину потока равной длине файла, таким образом, не оставляя места для заполнения, но я не знаю, как решить проблему.Пожалуйста, дайте ваши предложения.

        var root = new XElement("Users",
                            new XElement("User", new XAttribute("id", "1"), "User1"),
                            new XElement("User", new XAttribute("id", "2"), "User2"));
        var r = Rijndael.Create();
        r.Padding = PaddingMode.PKCS7;
        using (var fs = File.Open(@"D:\user.xml", FileMode.Create))
        using (var cs = new CryptoStream(fs, r.CreateEncryptor(r.Key, r.IV), CryptoStreamMode.Write))
        using (var sw = new StreamWriter(cs, Encoding.Unicode))
        {
            sw.Write(root.ToString());
            cs.FlushFinalBlock();
        }

        var r = Rijndael.Create();
        r.Padding = PaddingMode.PKCS7;
        using(var fs = File.Open(@"D:\user.xml", FileMode.Open, FileAccess.ReadWrite))
        using(var cs = new CryptoStream(fs, r.CreateDecryptor(r.Key, r.IV), CryptoStreamMode.Read))
        using (var sr = new StreamReader(cs, Encoding.Unicode))
        {
            var root = sr.ReadToEnd();
        }

1 Ответ

0 голосов
/ 22 марта 2012

Полагаю, вам также нужно очистить потоковую запись. Как примечание, убедитесь, что вы действительно используете случайный IV (что вы делаете здесь). Иногда люди пишут код, подобный этому, а затем, когда начинают использовать его для расшифровки файла позже, понимают, что у них нет IV, и поэтому они просто жестко кодируют его. Просто добавьте его в файл.

  {
        sw.Write(root.ToString());
        cs.FlushFinalBlock();
        sw.flush();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...