C# 从文件中解密 byte[] 时出错

C# getting error on decrypting byte[] from a file

我写这段代码来加密文本并将加密的文本写入文件,然后从文件中解密。但是我得到这个异常: System.Security.Cryptography.CryptographicException: 'The input data is not a complete block.' 当我使用 byte[] 存储数据时,它工作得很好,但似乎无法将文件正确转换为 byte[]。我也试过 File.ReadAllBytes 但我得到了同样的错误。请帮助我。

    class Program
    {
        static void Main(string[] args)
        {
            string decrypted;
            byte[] encrypted;
            Console.Write("Enter a text to encrypt : ");
            string plaintext = Console.ReadLine();
            using (Aes aes = Aes.Create())
            {
                encrypted = AesEncryption.Encrypt(plaintext, aes);
                File.WriteAllText(@"C:\Users\sepita\Desktop\My.txt", Encoding.UTF8.GetString(encrypted), Encoding.UTF8);
                decrypted = AesEncryption.Decrypt(Encoding.UTF8.GetBytes(File.ReadAllText(@"C:\Users\sepita\Desktop\My.txt")), aes);
            }
            Console.WriteLine($"Encrypted : {Encoding.UTF8.GetString(encrypted)}");
            Console.WriteLine($"Decrypted : {decrypted}");
        }
    }
    static class AesEncryption
    {
        public static byte[] Encrypt(string plaintext, Aes aes)
        {
            byte[] encrypted;
            ICryptoTransform encryptor = aes.CreateEncryptor();
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream stream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.Write(plaintext);
                    }
                    encrypted = memoryStream.ToArray();
                }
            }
            return encrypted;
        }
        public static string Decrypt(byte[] encrypted, Aes aes)
        {
            string decrypted = null;
            ICryptoTransform decryptor = aes.CreateDecryptor();
            using (MemoryStream memoryStream = new MemoryStream(encrypted))
            {
                using (CryptoStream stream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        decrypted = reader.ReadToEnd();
                    }
                }
            }
            return decrypted;
        }
    }

您的 Encrypt 函数的结果是二进制数据。如果这是一个有效的 UTF8 字符串,那就太幸运了,所以 Encoding.UTF8.GetString(encrypted) 通常不会工作。

替换为

            File.WriteAllBytes(@"C:\Users\sepita\Desktop\My.bin", encrypted);
            decrypted = AesEncryption.Decrypt(File.ReadAllBytes(@"C:\Users\sepita\Desktop\My.bin"), aes);

会起作用。 如果你想要一个文本文件,对二进制数据使用 BASE64 转换:

            File.WriteAllText(@"C:\Users\sepita\Desktop\My.txt", Convert.ToBase64String(encrypted));
            decrypted = AesEncryption.Decrypt(Convert.FromBase64String(File.ReadAllText(@"C:\Users\sepita\Desktop\My.txt")), aes);