MemoryStream和解密文本文件

时间:2012-04-27 16:04:51

标签: c# winforms cryptography encryption

我在尝试解密加密的文本文件时遇到了一个奇怪的问题。基本上.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的代码,它仅用于测试目的。

1 个答案:

答案 0 :(得分:3)

块密码CryptoStream只能加密或解密固定块大小的内容。你还没有给它足够的内容来填充最后一个块,所以它还在等待更多。这部分不完整的区块正在迷失。

您需要在CryptoStream上调用FlushFinalBlock或者在using之外,以便自动关闭它。然后你的MemoryStream应该包含缺少的字符。

请注意,解密输出时现在将向上舍入为完整的块,即您将在数据末尾填充额外的零。

相关问题