Расшифровка файла с помощью CryptoStream, но предотвращение записи файла - PullRequest
0 голосов
/ 16 мая 2018

Некоторое время назад я начал программировать свое собственное приложение AES, чтобы больше узнать о шифровании.Мне удалось заставить все приложение работать, за исключением одной вещи, с которой я все еще борюсь.

Вот такой сценарий: когда пользователь хочет расшифровать файлы, он должен ввести пароль, чтобы расшифровать файлы с помощью,Однако, когда пользователь вводит неправильный пароль, дешифрование должно завершиться неудачно.Я знаю, что когда CryptoStream создает исключение CryptoGraphicException, это означает, что что-то пошло не так, что в этом случае расшифровывается с неверным паролем.Я дам сообщение типа: «Заполнение недопустимо и не может быть удалено».

Проблема в том, что когда пользователь расшифровывает с неверным паролем, он все равно пишет новый файл, который будет содержать дешифрованное содержимое.Я действительно хочу предотвратить это, потому что он, по-видимому, изменяет содержимое зашифрованного файла, что делает его невозможным для его дальнейшего дешифрования.

Мой код дешифрования выглядит следующим образом:

            using (AesManaged aesManaged = new AesManaged())
            {
            //Console.WriteLine("Decrypting file using " + aesManaged.Mode + ", block size " + aesManaged.BlockSize + " and padding mode " + aesManaged.Padding + "...");

            byte[] salt = GetSaltFromCiphertext(cipherText);
            byte[] initializationVector = GetInitializationVectorFromCiphertext(cipherText);
            byte[] fileContentToDecrypt = GetContentFromCiphertext(cipherText);

            //Initialize the AES instance with the key and the initialization vector
            aesManaged.Key = GenerateKey(password, salt);
            aesManaged.IV = initializationVector;

            using (FileStream fileStream = new FileStream("../../Files/" + fileNameAndExtension, FileMode.Create))
            {
                using (CryptoStream cryptoStream = new CryptoStream(fileStream, aesManaged.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(fileContentToDecrypt, 0, fileContentToDecrypt.Length);
                }
            }
            }

Как сделатья запрещаю CryptoStream или FileStream записывать что-либо в файл, когда пользователь расшифровывает с неверным паролем?Я генерирую ключ шифрования из пароля, используя PBKDF2.

1 Ответ

0 голосов
/ 17 мая 2018

Я нашел решение, используя MemoryStream вместо FileStream.Это гарантирует, что он еще ничего не записал в файловый поток, когда в криптопотоке выдается исключение.Зашифрованный текст будет расположен в потоке памяти и может быть записан в файл, если расшифровка прошла успешно.

...