加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
2006-06-21 10:00
1551 查看
这两天一直在为文件加密解密时,由于关闭数据转换链接流CryptoStream或者使用FlushFinalBlock时出现的
“不正确的数据”和“要解密的数据长度无效”异常而烦恼,到现在也没弄懂具体是什么问题,如果有哪位高人能指点一下,在下不胜感激。
不过问题最终还是解决了,改变了加密和解密时的读取和写入的方式来解决了,最初都是直接对文件流操作,昨晚把它们修改为直接操作内存流。下面是操作文件流和操作内存流代码的对比:
直接操作文件流---加密:
上面的文件加密方法在加密的时候没有任何问题,但是同样的,稍微修改下,下面是对应的解密的方法:
上面的解密方法中,红颜色标识的两行代码,在有些情况下就会提示我上面所说的两种异常,到现在我唯一能稍微明白的是可能因为我加密后立即解密就会出现上面的异常情况,因为我查了好多资料都没有提示有这两种异常的出现。下面是我加密解密方法我改成操作内存流的代码,下面的代码能正常执行。
加密:
对应的解密方法:
“不正确的数据”和“要解密的数据长度无效”异常而烦恼,到现在也没弄懂具体是什么问题,如果有哪位高人能指点一下,在下不胜感激。
不过问题最终还是解决了,改变了加密和解密时的读取和写入的方式来解决了,最初都是直接对文件流操作,昨晚把它们修改为直接操作内存流。下面是操作文件流和操作内存流代码的对比:
直接操作文件流---加密:
程序代码: |
/// <summary> /// 文件加密 /// </summary> /// <param name="inFileName">需要加密的文件(文件的完整路径)</param> /// <param name="outFileName">加密后的文件(文件的完整路径)</param> /// <param name="sAlgorithm">对称算法实例</param> /// <returns>bool</returns> private bool EncryptFile(string InFileName, string OutFileName, SymmetricAlgorithm sAlgorithm) { try { //创建加密文件流 FileStream inFileStream = new FileStream(InFileName, FileMode.Open, FileAccess.Read); FileStream outFileStream = new FileStream(OutFileName, FileMode.OpenOrCreate, FileAccess.Write); //锁定被加密文件 inFileStream.Lock(0, inFileStream.Length); //设定加密后文件的初始长度 outFileStream.SetLength(0); long fileLength = inFileStream.Length; //文件的总字节数组长度 byte[] bytein = new byte[100]; //每次以100个字节读取需要加密的文件 long readedlen = 0; //记录已被读取的字节位置 int len = 0; //每次写入的字节长度 CryptoStream encStream = new CryptoStream(outFileStream, sAlgorithm.CreateEncryptor(this.KeyValue, this.IVValue), CryptoStreamMode.Write); try { while (readedlen < fileLength) { len = inFileStream.Read(bytein, 0, 100);//从输入流中读取100字节数组数据到bytein缓冲区 encStream.Write(bytein, 0, 100); readedlen = readedlen + len; } outFileStream.Flush(); inFileStream.Flush(); encStream.Flush(); return true; } catch (Exception error) { throw (error); } finally { inFileStream.Unlock(0, inFileStream.Length); encStream.Close(); inFileStream.Close(); outFileStream.Close(); } } catch (Exception error) { throw (error); } } |
程序代码: |
/// <summary> /// 文件解密 /// </summary> /// <param name="inFileName">需要解密的文件(文件的完整路径)</param> /// <param name="outFileName">解密后的文件(文件的完整路径)</param> /// <param name="sAlgorithm">对称算法实例</param> /// <returns>bool</returns> public bool DecryptFile(string InFileName, string OutFileName, SymmetricAlgorithm sAlgorithm) { try { //创建解密文件流 FileStream inFileStream = new FileStream(InFileName, FileMode.Open, FileAccess.Read); FileStream outFileStream = new FileStream(OutFileName, FileMode.OpenOrCreate, FileAccess.Write); //设定加密后文件的初始长度 outFileStream.SetLength(0); long fileLength = inFileStream.Length; //文件的总字节数组长度 byte[] bytein = new byte[100]; //每次以100个字节读取需要加密的文件 long readedlen = 0; //记录已被读取的字节位置 int len = 0; //每次写入的字节长度 CryptoStream encStream = new CryptoStream(outFileStream, sAlgorithm.CreateDecryptor(this.KeyValue, this.IVValue), CryptoStreamMode.Write); try { while (readedlen < fileLength) { len = inFileStream.Read(bytein, 0, 100);//从输入流中读取100字节数组数据到bytein缓冲区 encStream.Write(bytein, 0, 100); readedlen = readedlen + len; } outFileStream.Flush(); inFileStream.Flush(); encStream.FlushFinalBlock(); //加了这一句,有的时候就会出现异常,不知道为什么 return true; } catch (Exception error) { throw (error); } finally { encStream.Close(); //加了这一句,有的时候就会出现异常,不知道为什么 inFileStream.Close(); outFileStream.Close(); } } catch (Exception error) { throw (error); } } |
加密:
程序代码: |
/// <summary> /// 文件加密 /// </summary> /// <param name="inFileName">需要加密的文件(文件的完整路径)</param> /// <param name="outFileName">加密后的文件(文件的完整路径)</param> /// <param name="sAlgorithm">对称算法实例</param> /// <returns>bool</returns> private bool EncryptFile(string InFileName, string OutFileName, SymmetricAlgorithm sAlgorithm) { //将文件内容读取到字节数组 FileStream inFileStream = new FileStream(InFileName, FileMode.Open, FileAccess.Read); byte[] sourceByte = new byte[inFileStream.Length]; inFileStream.Read(sourceByte, 0, sourceByte.Length); inFileStream.Flush(); inFileStream.Close(); MemoryStream encryptStream = new MemoryStream(); CryptoStream encStream = new CryptoStream(encryptStream, sAlgorithm.CreateEncryptor(), CryptoStreamMode.Write); try { //利用链接流加密源字节数组 encStream.Write(sourceByte, 0, sourceByte.Length); encStream.FlushFinalBlock(); //将字节数组信息写入指定文件 FileStream outFileStream= new FileStream(OutFileName, FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter bWriter = new BinaryWriter(outFileStream); bWriter.Write(encryptStream.ToArray()); encryptStream.Flush(); bWriter.Close(); encryptStream.Close(); } catch (Exception error) { throw (error); } finally { encryptStream.Close(); encStream.Close(); } return true; } |
程序代码: |
/// <summary> /// 文件解密 /// </summary> /// <param name="inFileName">需要解密的文件(文件的完整路径)</param> /// <param name="outFileName">解密后的文件(文件的完整路径)</param> /// <param name="sAlgorithm">对称算法实例</param> /// <returns>bool</returns> public bool DecryptFile(string InFileName, string OutFileName, SymmetricAlgorithm sAlgorithm) { //读取被加密文件到字节数组 FileStream encryptFileStream= new FileStream(InFileName, FileMode.Open, FileAccess.Read); byte[] encryptByte = new byte[encryptFileStream.Length]; encryptFileStream.Read(encryptByte, 0, encryptByte.Length); encryptFileStream.Flush(); encryptFileStream.Close(); MemoryStream decryptStream = new MemoryStream(); CryptoStream encStream = new CryptoStream(decryptStream, sAlgorithm.CreateDecryptor(), CryptoStreamMode.Write); try { encStream.Write(encryptByte, 0, encryptByte.Length); encStream.FlushFinalBlock(); byte[] decryptByte = decryptStream.ToArray(); FileStream decryptFileStream= new FileStream(OutFileName, FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter bWriter = new BinaryWriter(decryptFileStream, Encoding.GetEncoding("GB18030")); bWriter.Write(decryptByte); decryptFileStream.Flush(); bWriter.Close(); decryptFileStream.Close(); } catch (Exception error) { throw (error); } finally { decryptStream.Close(); encStream.Close(); } return true; } |
相关文章推荐
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误
- 【转】"已成功与服务器建立连接,但是在登录前的握手期间发生错误"问题解决方案
- Unity中启动VS时出现"Visual Studio 2010 Shell 无效的许可证数据"的解决办法
- win7下IIS错误:"无法访问请求的页面,因为该页的相关配置数据无效"的解决方法(转)
- 关于AES在Linux下加密解密出错问题解决方案
- "已成功与服务器建立连接,但是在登录前的握手期间发生错误"问题解决方案
- "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法
- hadoop入门搭windows eclipse环境时遇到的几个问题以及解决方案
- windows8.1上安装scala出现"此时不应有 \scala\bin\scala.bat"问题解决方案
- 解决 "GStreamer 遇到了常规流错误"问题
- vs上出现"未能加载项目文件,根级别上的数据无效.Microsoft.WinFx.targets"的解决办法
- 解决content-type为"application/json"的post过来的数据在php端接受不到的问题
- Base-64 字符数组或字符串的长度无效等问题解决方案
- 自己遇到的"Microsoft Management Console遇到问题需要关闭,我们对此引起的不便表示抱歉……"问题的解决方法
- "Server Tomcat v8.0 Server at localhost failed to start"问题解决方案之一
- Android项目中http数据传输加密问题方案以及NDK编译加密算法
- 关于遇到的 C# DES 解密出现 "CryptographicException:不正确的数据"
- windows7上安装scala出现"此时不应有 \scala\bin\scala.bat"问题解决方案
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为