1

我在尝试解密加密的文本文件时遇到了一个奇怪的问题。基本上 .txt 文件的内容是“这是一个测试:)”,当解密输出是“这是一个测试:”时,找出丢失的“)”。

当我一次解密文件一个字节(while循环)时,情况并非如此,但是当使用下面的代码时,它似乎有上述问题。

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();
            }
        }

请原谅草率的代码,它只是用于测试目的。

4

1 回答 1

3

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

您要么需要在 CryptoStream 上调用FlushFinalBlock,要么不在其范围内,using以便它自动关闭它。那么你的 MemoryStream 应该包含缺失的字符。

请注意,在解密时,您的输出现在将被四舍五入到一个完整的块,即您将获得额外的零填充数据的末尾。

于 2012-04-27T16:10:58.797 回答