我在尝试解密加密的文本文件时遇到了一个奇怪的问题。基本上.txt文件的内容是“这是一个测试:)”,当解密输出是“这是一个测试:”时,找出丢失的“)”。
当我一次解密一个字节(循环时)时不是这种情况,但是当使用下面的代码时,它似乎有上述问题。
private static void DecryptFile(string inputFile, string outputFile, string skey)
{
RijndaelManaged aes = new RijndaelManaged();
try
{
byte[] key = ASCIIEncoding.UTF8.GetBytes(skey);
byte[] file = File.ReadAllBytes(inputFile);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(key, key), CryptoStreamMode.Write))
{
cs.Write(file, 0, file.Length);
File.WriteAllBytes(outputFile, ms.ToArray());
aes.Clear();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
aes.Clear();
}
}
请原谅邋code的代码,它仅用于测试目的。
答案 0 :(得分:3)
块密码CryptoStream只能加密或解密固定块大小的内容。你还没有给它足够的内容来填充最后一个块,所以它还在等待更多。这部分不完整的区块正在迷失。
您需要在CryptoStream上调用FlushFinalBlock或者在using
之外,以便自动关闭它。然后你的MemoryStream应该包含缺少的字符。
请注意,解密输出时现在将向上舍入为完整的块,即您将在数据末尾填充额外的零。