C# “C”;“坏数据”;解密加密文件时发生异常
嘿,老实说,我对加密和解密,甚至是c语言都很陌生。基本上,我有一个tcp聊天服务器,“保存”日志并加密文本文件。这是我加密的方式(基于MSDN示例): 该方法成功地对文件进行了完全加密。这是我的解密方法:C# “C”;“坏数据”;解密加密文件时发生异常,c#,file,encryption,cryptostream,C#,File,Encryption,Cryptostream,嘿,老实说,我对加密和解密,甚至是c语言都很陌生。基本上,我有一个tcp聊天服务器,“保存”日志并加密文本文件。这是我加密的方式(基于MSDN示例): 该方法成功地对文件进行了完全加密。这是我的解密方法: public static void DecryptFile(string strInputFileName, string strOutputFileName, string strKey) { DESCryptoServiceProvider des = new DESCrypto
public static void DecryptFile(string strInputFileName, string strOutputFileName, string strKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);
byte[] te = new byte[1024];
FileStream fsRead = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = des.CreateDecryptor();
CryptoStream cryptostream = new CryptoStream(fsRead, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(strOutputFileName);
fsDecrypted.Write(new StreamReader(cryptostream).ReadToEnd());//This is where the "Bad Data" occurs.
fsDecrypted.Flush();
fsDecrypted.Close();
fsRead.Close();
}
当我检查cryptostream对象时,它说它抛出了一个异常,“Stream不支持查找”
任何帮助都将不胜感激 这里:
cryptostream.Write(byteArrayInput, 0, byteArrayInput.Length);
fsIn.Close();
fsOut.Close();
您正在直接关闭fsOut
,而没有关闭cryptostream
。这意味着加密流没有机会刷新任何最终块等
此外:
- 使用
语句,而不是手动调用Close或Dispose
- 您当前正在调用
一次,并假设它将读取所有数据-您没有检查返回值。(出于某种原因,您还删除了输入文件的最后一个字节……为什么?)通常,您应该循环,读取缓冲区,然后写出您读取的字节数,直到read方法返回0。如果您使用的是.NET4,Read
是您的朋友Stream.CopyTo
public static string DecryptString(string encriptedText, string key)
{
try
{
//Convert the text into bytest
byte[] ecriptedBytes = System.Convert.FromBase64String(encriptedText);
// Create a memory stream to the passed buffer
MemoryStream objMemStream = new MemoryStream(ecriptedBytes);
//Set the legal keys and initialization verctors
objCrptoService.Key = GetLegalsecretKey(key);
objCrptoService.IV = GetLegalIV();
// Create a CryptoStream using the memory stream and the cryptographic service provider version
// of the Data Encryption stanadard algorithm key
CryptoStream objCryptStream = new CryptoStream(objMemStream, objCrptoService.CreateDecryptor(), CryptoStreamMode.Read);
// Create a StreamReader for reading the stream.
//StreamReader objstreamReader = new StreamReader(objCryptStream);
MemoryStream stream = new MemoryStream();
objCryptStream.CopyTo(stream);
stream.Position = 0;
StreamReader R = new StreamReader(stream);
string outputText = R.ReadToEnd();
// Close the streams.
R.Close();
objCryptStream.Close();
objMemStream.Close();
return outputText;
}
catch (Exception exc)
{
return "";
}
}
解决我的问题的方法是在创建文件时调用cryptostream上的FlushFinalBlock
CryptoStream cryptostream = new CryptoStream(memoryStream, this._encryptionKeyHelper.Encryptor(), CryptoStreamMode.Write);
xmlser.Serialize(cryptostream, builderObject);
cryptostream.FlushFinalBlock();
谢谢我真的需要进一步研究这个问题。我在试验MSDN中的代码示例,却不知道它们到底做了什么。我将FlushFinalBlock()调用到cryptostream,并从输入文件中删除了-1,从而解决了这个问题。谢谢
public static string DecryptString(string encriptedText, string key)
{
try
{
//Convert the text into bytest
byte[] ecriptedBytes = System.Convert.FromBase64String(encriptedText);
// Create a memory stream to the passed buffer
MemoryStream objMemStream = new MemoryStream(ecriptedBytes);
//Set the legal keys and initialization verctors
objCrptoService.Key = GetLegalsecretKey(key);
objCrptoService.IV = GetLegalIV();
// Create a CryptoStream using the memory stream and the cryptographic service provider version
// of the Data Encryption stanadard algorithm key
CryptoStream objCryptStream = new CryptoStream(objMemStream, objCrptoService.CreateDecryptor(), CryptoStreamMode.Read);
// Create a StreamReader for reading the stream.
//StreamReader objstreamReader = new StreamReader(objCryptStream);
MemoryStream stream = new MemoryStream();
objCryptStream.CopyTo(stream);
stream.Position = 0;
StreamReader R = new StreamReader(stream);
string outputText = R.ReadToEnd();
// Close the streams.
R.Close();
objCryptStream.Close();
objMemStream.Close();
return outputText;
}
catch (Exception exc)
{
return "";
}
}
CryptoStream cryptostream = new CryptoStream(memoryStream, this._encryptionKeyHelper.Encryptor(), CryptoStreamMode.Write);
xmlser.Serialize(cryptostream, builderObject);
cryptostream.FlushFinalBlock();