日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案

發(fā)布時間:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這兩天一直在為文件加密解密時,由于關閉數(shù)據(jù)轉(zhuǎn)換鏈接流CryptoStream或者使用FlushFinalBlock時出現(xiàn)的
“不正確的數(shù)據(jù)”和“要解密的數(shù)據(jù)長度無效”異常而煩惱,到現(xiàn)在也沒弄懂具體是什么問題,如果有哪位高人能指點一下,在下不勝感激。
????不過問題最終還是解決了,改變了加密和解密時的讀取和寫入的方式來解決了,最初都是直接對文件流操作,昨晚把它們修改為直接操作內(nèi)存流。下面是操作文件流和操作內(nèi)存流代碼的對比:

直接操作文件流---加密:

程序代碼:

///?<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
????{
?//創(chuàng)建加密文件流
?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;??//文件的總字節(jié)數(shù)組長度
?byte[]?bytein?=?new?byte[100];????????//每次以100個字節(jié)讀取需要加密的文件
?long?readedlen?=?0;????????????????????//記錄已被讀取的字節(jié)位置
?int?len?=?0;????????????????????//每次寫入的字節(jié)長度
?CryptoStream?encStream?=?new?CryptoStream(outFileStream,?sAlgorithm.CreateEncryptor(this.KeyValue,?this.IVValue),?CryptoStreamMode.Write);
?try
?{
?????while?(readedlen?<?fileLength)
?????{
??len?=?inFileStream.Read(bytein,?0,?100);//從輸入流中讀取100字節(jié)數(shù)組數(shù)據(jù)到bytein緩沖區(qū)
??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
????{
?//創(chuàng)建解密文件流
?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;??//文件的總字節(jié)數(shù)組長度
?byte[]?bytein?=?new?byte[100];????????//每次以100個字節(jié)讀取需要加密的文件
?long?readedlen?=?0;????????????????????//記錄已被讀取的字節(jié)位置
?int?len?=?0;????????????????????//每次寫入的字節(jié)長度
?CryptoStream?encStream?=?new?CryptoStream(outFileStream,?sAlgorithm.CreateDecryptor(this.KeyValue,?this.IVValue),?CryptoStreamMode.Write);
?try
?{
?????while?(readedlen?<?fileLength)
?????{
??len?=?inFileStream.Read(bytein,?0,?100);//從輸入流中讀取100字節(jié)數(shù)組數(shù)據(jù)到bytein緩沖區(qū)
??encStream.Write(bytein,?0,?100);
??readedlen?=?readedlen?+?len;
?????}
?????outFileStream.Flush();
?????inFileStream.Flush();
?????encStream.FlushFinalBlock();?//加了這一句,有的時候就會出現(xiàn)異常,不知道為什么??
?????return?true;?
?}
?catch?(Exception?error)
?{
?????throw?(error);
?}
?finally
?{
?????encStream.Close();?//加了這一句,有的時候就會出現(xiàn)異常,不知道為什么??
?????inFileStream.Close();
?????outFileStream.Close();
?}
????}
????catch?(Exception?error)
????{
?throw?(error);
????}
}


上面的解密方法中,紅顏色標識的兩行代碼,在有些情況下就會提示我上面所說的兩種異常,到現(xiàn)在我唯一能稍微明白的是可能因為我加密后立即解密就會出現(xiàn)上面的異常情況,因為我查了好多資料都沒有提示有這兩種異常的出現(xiàn)。下面是我加密解密方法我改成操作內(nèi)存流的代碼,下面的代碼能正常執(zhí)行。
加密:
程序代碼:

///?<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)
{
????//將文件內(nèi)容讀取到字節(jié)數(shù)組
????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
????{
?//利用鏈接流加密源字節(jié)數(shù)組
?encStream.Write(sourceByte,?0,?sourceByte.Length);
?encStream.FlushFinalBlock();

?//將字節(jié)數(shù)組信息寫入指定文件
?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)
{

????//讀取被加密文件到字節(jié)數(shù)組
????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;
}

轉(zhuǎn)載于:https://www.cnblogs.com/my-blog/archive/2009/03/03/1402246.html

總結(jié)

以上是生活随笔為你收集整理的加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。