如题所说:c#中为什么加密一个文件后文件大小会改变,解密该文件会有数据冗余?
//
//待加密的文件contacts.xml里面的内容
//
<?xml version="1.0" encoding="gb2312"?>
<contacts>
<contact>
<contactName>刘宝煌</contactName>
<contactSchoolName>北京邮电大学</contactSchoolName>
<contactAcademyName>理学院</contactAcademyName>
<contactGrade>2006</contactGrade>
<contactClass>06202</contactClass>
<contactMobileNumber>13810781191</contactMobileNumber>
<contactTelephoneNumber>0898-66793901</contactTelephoneNumber>
<contactQqNumber>68383598</contactQqNumber>
<contactEmail>[email protected]</contactEmail>
<contactAddress>海南省海口市</contactAddress>
<contactBlessingWords>祝大家心想事成</contactBlessingWords>
<contactImage></contactImage>
</contact>
</contacts>//
//我的加密方法的实现
//说明:xmlPath是contacts.xml的文件路径。该方法实现对contacts.xml加密并将密文重新写入contacts.xml中
//
public static void EncryptXML()
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] encryptKey ={ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
byte[] encryptIV ={ 0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
des.Key = encryptKey;
des.IV = encryptIV;
try
{
ICryptoTransform encryptor = des.CreateEncryptor();
FileStream fileStream = new FileStream(xmlPath, FileMode.Open);
StreamReader streamReader = new StreamReader(fileStream, Encoding.Default);
xmlText = streamReader.ReadToEnd();
byte[] xmlTextBytes = Encoding.Default.GetBytes(xmlText);
MemoryStream mryStream = new MemoryStream();
CryptoStream cptStream = new CryptoStream(mryStream, encryptor, CryptoStreamMode.Write);
cptStream.Write(xmlTextBytes, 0, xmlTextBytes.Length);
cptStream.FlushFinalBlock();
mryStream.Close();
byte[] encryptedBytes = mryStream.ToArray();
xmlText= Convert.ToBase64String(encryptedBytes);
StreamWriter writer = new StreamWriter(fileStream, Encoding.Default);
fileStream.Seek(0, SeekOrigin.Begin);
writer.Write(xmlText);
writer.Flush();
fileStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}//
//解密方法的实现
//说明:该方法实现对加密过的contacts.xml文件的内容读取,并解密密文,然后把明文重新写入contacts.xml中
//
public static void DecryptXML()
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] encryptKey ={ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
byte[] encryptIV ={ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
des.Key = encryptKey;
des.IV = encryptIV;
try
{
ICryptoTransform decryptor = des.CreateDecryptor();
FileStream encryptedStream = new FileStream(xmlPath, FileMode.Open);
StreamReader encReader = new StreamReader(encryptedStream, Encoding.Default);
xmlText= encReader.ReadToEnd();
byte[] xmlTextBytes = Convert.FromBase64String(xmlText);
MemoryStream mryStream = new MemoryStream(xmlTextBytes, 0, xmlTextBytes.Length);
CryptoStream cptStream = new CryptoStream(mryStream, decryptor, CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cptStream, Encoding.Default);
xmlText= reader.ReadToEnd();
MessageBox.Show(xmlText);
StreamWriter writer = new StreamWriter(encryptedStream, Encoding.Default);
encryptedStream.Seek(0, SeekOrigin.Begin);
writer.Write(xmlText);
writer.Flush();
encryptedStream.Close();
mryStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}现在遇到的问题是:在调用EncryptXML()方法进行加密时,对contacts.xml内容加密所得的密文的大小比原来的明文要大。然后调用DecryptXML()方法进行解密后,contacts.xml里面的内容除了加密前的内容之外会多出一部分数据(不知道是怎么生成的数据?)。
本人的想法:我认为是FromBase64String(),ToBase64String()这两个方法的编码导致数据量增大,但是用Encoding,UTF8Encoding等类的其他编码转换会导致加解密出错,所以实在想不出什么方法来解决这个问题。希望高手们能指导一下。谢谢啊!!~~
//
//待加密的文件contacts.xml里面的内容
//
<?xml version="1.0" encoding="gb2312"?>
<contacts>
<contact>
<contactName>刘宝煌</contactName>
<contactSchoolName>北京邮电大学</contactSchoolName>
<contactAcademyName>理学院</contactAcademyName>
<contactGrade>2006</contactGrade>
<contactClass>06202</contactClass>
<contactMobileNumber>13810781191</contactMobileNumber>
<contactTelephoneNumber>0898-66793901</contactTelephoneNumber>
<contactQqNumber>68383598</contactQqNumber>
<contactEmail>[email protected]</contactEmail>
<contactAddress>海南省海口市</contactAddress>
<contactBlessingWords>祝大家心想事成</contactBlessingWords>
<contactImage></contactImage>
</contact>
</contacts>//
//我的加密方法的实现
//说明:xmlPath是contacts.xml的文件路径。该方法实现对contacts.xml加密并将密文重新写入contacts.xml中
//
public static void EncryptXML()
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] encryptKey ={ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
byte[] encryptIV ={ 0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
des.Key = encryptKey;
des.IV = encryptIV;
try
{
ICryptoTransform encryptor = des.CreateEncryptor();
FileStream fileStream = new FileStream(xmlPath, FileMode.Open);
StreamReader streamReader = new StreamReader(fileStream, Encoding.Default);
xmlText = streamReader.ReadToEnd();
byte[] xmlTextBytes = Encoding.Default.GetBytes(xmlText);
MemoryStream mryStream = new MemoryStream();
CryptoStream cptStream = new CryptoStream(mryStream, encryptor, CryptoStreamMode.Write);
cptStream.Write(xmlTextBytes, 0, xmlTextBytes.Length);
cptStream.FlushFinalBlock();
mryStream.Close();
byte[] encryptedBytes = mryStream.ToArray();
xmlText= Convert.ToBase64String(encryptedBytes);
StreamWriter writer = new StreamWriter(fileStream, Encoding.Default);
fileStream.Seek(0, SeekOrigin.Begin);
writer.Write(xmlText);
writer.Flush();
fileStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}//
//解密方法的实现
//说明:该方法实现对加密过的contacts.xml文件的内容读取,并解密密文,然后把明文重新写入contacts.xml中
//
public static void DecryptXML()
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] encryptKey ={ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
byte[] encryptIV ={ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
des.Key = encryptKey;
des.IV = encryptIV;
try
{
ICryptoTransform decryptor = des.CreateDecryptor();
FileStream encryptedStream = new FileStream(xmlPath, FileMode.Open);
StreamReader encReader = new StreamReader(encryptedStream, Encoding.Default);
xmlText= encReader.ReadToEnd();
byte[] xmlTextBytes = Convert.FromBase64String(xmlText);
MemoryStream mryStream = new MemoryStream(xmlTextBytes, 0, xmlTextBytes.Length);
CryptoStream cptStream = new CryptoStream(mryStream, decryptor, CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cptStream, Encoding.Default);
xmlText= reader.ReadToEnd();
MessageBox.Show(xmlText);
StreamWriter writer = new StreamWriter(encryptedStream, Encoding.Default);
encryptedStream.Seek(0, SeekOrigin.Begin);
writer.Write(xmlText);
writer.Flush();
encryptedStream.Close();
mryStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}现在遇到的问题是:在调用EncryptXML()方法进行加密时,对contacts.xml内容加密所得的密文的大小比原来的明文要大。然后调用DecryptXML()方法进行解密后,contacts.xml里面的内容除了加密前的内容之外会多出一部分数据(不知道是怎么生成的数据?)。
本人的想法:我认为是FromBase64String(),ToBase64String()这两个方法的编码导致数据量增大,但是用Encoding,UTF8Encoding等类的其他编码转换会导致加解密出错,所以实在想不出什么方法来解决这个问题。希望高手们能指导一下。谢谢啊!!~~
如a加密后数据大小长度肯定不同
,页面的viewstate就是用base64加密的
多出的部分数据是什么数据,原来数据是否一致
当Convert.FromBase64String方法的参数s的长度小于 4 或不是 4 的偶数倍时,将会抛出FormatException。
public string Encrypto(string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// 解密方法
public string Decrypto(string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
解密完的string写入文件时,原来的文件内容没有清除
dataset myds = new dataset
myds.redxml(路径)
------操作清空。