加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案
生活随笔
收集整理的這篇文章主要介紹了
加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這兩天一直在為文件加密解密時,由于關閉數據轉換鏈接流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; } |
轉載于:https://www.cnblogs.com/my-blog/archive/2009/03/03/1402246.html
總結
以上是生活随笔為你收集整理的加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近日小节
- 下一篇: 自动登录126邮箱的脚本