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



我编写此代码来加密文本并将加密的文本写入文件,然后从文件中解密。但是我得到这个异常:System.Security.Cryptography.CryptographicException:"输入数据不是一个完整的块。当我使用 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:UserssepitaDesktopMy.txt", Encoding.UTF8.GetString(encrypted), Encoding.UTF8);
decrypted = AesEncryption.Decrypt(Encoding.UTF8.GetBytes(File.ReadAllText(@"C:UserssepitaDesktopMy.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:UserssepitaDesktopMy.bin", encrypted);
decrypted = AesEncryption.Decrypt(File.ReadAllBytes(@"C:UserssepitaDesktopMy.bin"), aes);

会工作。 如果需要文本文件,请对二进制数据使用 BASE64 转换:

File.WriteAllText(@"C:UserssepitaDesktopMy.txt", Convert.ToBase64String(encrypted));
decrypted = AesEncryption.Decrypt(Convert.FromBase64String(File.ReadAllText(@"C:UserssepitaDesktopMy.txt")), aes);

最新更新