使用 CryptoStream returns 解密一个空文件

Decryption using CryptoStream returns an empty file

我正在尝试使用 AES 来了解 encryption/decryption 的工作原理。加密文件可以正常使用以下代码: (这些方法在两个单独的文件中)

        private void tempEncrypt()
        {
            // Creates file with "Test String" inside
            byte[] test = Encoding.ASCII.GetBytes("Test String");
            var file = File.Create("test.txt");
            file.Write(test, 0, test.Length);

            // Saves key and IV for decryption
            var temp = new AesCryptoServiceProvider();
            Console.WriteLine(System.Convert.ToBase64String(temp.Key));
            Console.WriteLine(System.Convert.ToBase64String(temp.IV));

            Encryptor.Encrypt(file, temp.Key, temp.IV);
        }

        public static void Encrypt(FileStream source, byte[] key, byte[] IV)
        {
            // Creates a temp file for encrypting
            var destination = File.Create("encrypted.tmp");
            string path = source.Name;

            using (var provider = new AesCryptoServiceProvider())
            using (var transform = provider.CreateEncryptor(key, IV))
            using (var cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
            {
                // Encrypts file
                source.CopyTo(cryptoStream);
                source.Close();

                // Deletes unencrypted file
                File.Delete(path);
            }
            // Replaces source file with encrypted file
            destination.Close();
            File.Move(destination.Name, path);
            File.Delete(destination.Name);
        }

但是当我用这个解密文件时,文件会是空的:

        private void tempDecrypt()
        {
            // Opens encrypted file
            var file = File.OpenRead("test.txt");
            var temp = new AesCryptoServiceProvider();
            temp.Key = System.Convert.FromBase64String("SANeQe1MK4UKrQmJ4fa16lrhIexK7gaxqE/N/HycdhI=");
            temp.IV = System.Convert.FromBase64String("Pb2SciISBP2p0hWzEUG05A==");
            Encryptor.Decrypt(file, temp.Key, temp.IV);
        }

        public static void Decrypt(FileStream source, byte[] key, byte[] IV)
        {
            // Creates a temp file for decrypting
            var destination = File.Create("decrypted.tmp");
            string path = source.Name;

            Console.WriteLine(source.Length);

            // Decrypts rest of file
            using (var provider = new AesCryptoServiceProvider())
            using (var transform = provider.CreateDecryptor(key, IV))
            using (var cryptoStream = new CryptoStream(source, transform, CryptoStreamMode.Read))
            {
                // Decrypts file
                cryptoStream.CopyTo(destination);
            }
            // Replaces source file with decrypted file
            destination.Close();
            source.Close();
            File.Delete(path);
            File.Move(destination.Name, path);
            File.Delete(destination.Name);
        }

替换文件似乎不是问题,因为即使“decrypted.tmp”在我用源文件替换目标文件之前也是空的。

在 tempEncrypt() 方法中,我必须关闭文件然后使用 File.OpenRead() 重新打开它才能正确解密。我猜 test.txt 仍然是空的,即使我使用 file.Write() 写入文件。这是工作方法:

        private void tempEncrypt()
        {
            // Creates file with "Test String" inside
            byte[] test = Encoding.ASCII.GetBytes("Test String");
            var file = File.Create("test.txt");
            file.Write(test, 0, test.Length);
            
            file.Close();
            var newFile = File.OpenRead("test.txt");

            // Saves key and IV for decryption
            var temp = new AesCryptoServiceProvider();
            Console.WriteLine(System.Convert.ToBase64String(temp.Key));
            Console.WriteLine(System.Convert.ToBase64String(temp.IV));

            Encryptor.Encrypt(newFile, temp.Key, temp.IV);
        }