C# 使用CryptoStream解密文件但阻止写入文件

C# 使用CryptoStream解密文件但阻止写入文件,c#,file,encryption,aes,C#,File,Encryption,Aes,不久前,我开始编写自己的AES应用程序,以了解有关加密的更多信息。我设法使整个应用程序正常工作,除了一件我仍在努力解决的事情 正是这种情况: 当用户想要解密文件时,用户必须输入密码才能用密码解密文件。但是,当用户输入错误的密码时,解密将失败。我知道当Cryptographicstream抛出CryptoGraphicException时,这意味着出现了问题,在本例中是使用错误的密码进行解密。我会给出这样的信息:“填充无效,无法删除” 问题是,当用户使用错误的密码解密时,它仍然会写入一个包含解密内

不久前,我开始编写自己的AES应用程序,以了解有关加密的更多信息。我设法使整个应用程序正常工作,除了一件我仍在努力解决的事情

正是这种情况: 当用户想要解密文件时,用户必须输入密码才能用密码解密文件。但是,当用户输入错误的密码时,解密将失败。我知道当Cryptographicstream抛出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从密码生成加密密钥。

我通过使用内存流而不是文件流找到了解决方案。这可以确保当加密流引发异常时,它还没有向文件流写入任何内容。密文将位于memorystream中,如果解密顺利,可以写入文件。

写入临时文件?写入memorystream?我想用解密文件覆盖加密文件。即使密码是错误的,它仍然会这样做。加密流在写入时加密,在读取时解密……这里的加密流解密它。您可以看到,我传递了aesManager.CreateDecryptor()。不要解密到FileStream,首先解密到MemoryStream,只有在成功解密后才写入文件。