一个使用DES进行文件加密解密的类,之前解决了“要解密的数据长度无效”的错误,现在又出现了另一个错误:对图片文件进行加密解密操作成功,但对文本文件进行加密,再解密出来时候,却发现会在原来文本结尾多了些乱码,百思不得其解,望高手赐教。
    class DESCrypt
    {
        private byte[] Key = new byte[8]{1,8,2,7,3,6,4,5};
        public void Encrypt(string FileName)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = Key;
            des.IV = Key;
            FileStream InputFileStream = File.OpenRead(FileName);
            byte[] FileStreamArray = new byte[InputFileStream.Length];
            InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
            InputFileStream.Close();
            MemoryStream ms = new MemoryStream();
            CryptoStream FileCryptoStream = new CryptoStream(ms,des.CreateEncryptor(), CryptoStreamMode.Write);
            FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
            FileCryptoStream.FlushFinalBlock();
            InputFileStream = File.OpenWrite(FileName);
            foreach (byte b in ms.ToArray())
            {
                InputFileStream.WriteByte(b);
            }
            FileCryptoStream.Close();
            InputFileStream.Close();
            ms.Close();
        }
        public void Decrypt(string FileName) 
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = Key;
            des.IV = Key;
            FileStream InputFileStream = File.OpenRead(FileName);
            byte[] FileStreamArray = new byte[InputFileStream.Length];
            InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
            InputFileStream.Close();
            MemoryStream ms = new MemoryStream();
            CryptoStream FileCryptoStream = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
            FileCryptoStream.FlushFinalBlock();
            InputFileStream = File.OpenWrite(FileName);
            foreach (byte b in ms.ToArray())
            {
                InputFileStream.WriteByte(b);
            }
            FileCryptoStream.Close();
            InputFileStream.Close();
            ms.Close();
        }
    }

解决方案 »

  1.   

    InputFileStream = File.OpenWrite(FileName); 
    只会覆盖对应字解位置的内容你应该用BinaryWriter这类的东西来帮你输出
      

  2.   


    就是这种情况,譬如现在那个未加密的文件的内容是123文件长度是3个字节加密后,文件长度是8个字节而当你解密后,明文本来是正确的,但是
    InputFileStream = File.OpenWrite(FileName); 是在一个不覆盖文件,而是覆盖内容的方法(当然,可能内部会有些开关可以控制,我就没有看了)
    所以你在那里WriteByte的话,就等于覆盖了内容,所以头3个字节是对的,但这个时候,应该是已经结束。
    但由于原来加密后的文件就有8个字节,所以它会继续保持着8个字节。(当然后5个字节的内容也是保持着)所以干脆就是以覆盖文件的方式,而不是覆盖内容的方式
    使用BinaryWriter或者StreamWriter来写入是最安全的办法
      

  3.   

    我使用了InputFileStream = File.Creat(FileName);这种办法,果然是搞掂了。但不知道会不会有后遗症~