如题所说: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等类的其他编码转换会导致加解密出错,所以实在想不出什么方法来解决这个问题。希望高手们能指导一下。谢谢啊!!~~

解决方案 »

  1.   

    加密数据与原来肯定不一样,文件大小肯定改变。
    如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();
            }
      

  2.   

    你的解密方法有误
    解密完的string写入文件时,原来的文件内容没有清除
      

  3.   

    加密是否有冗余于是由加密算法决定的,对于base64,编码后数据会增大1/3。
      

  4.   

    请教各位大大,我在解密之后将所得的明文(该明文如果在richtextbox里面显示的时候是不包含多余数据的),但在写入contacts.xml的时候明文内容后面会多出一部分无关数据,我应该怎么去实现类型转换才能使得文件内容能正常加解密且写入contacts.xml时没有多余数据产生?
      

  5.   

    已经知道为什么多出那部分的数据了,在解密之后需要先清空contacts.xml内容才不会多出那部分数据。现在想请问下清除contacts.xml里面的内容有哪些方法呢?
      

  6.   

    contacts.xml 读到dataset里 然后再操作 
    dataset myds = new dataset
    myds.redxml(路径)
    ------操作清空。
      

  7.   

    没必要用到dataset,可以在streamwriter这个类实现~~
      

  8.   

    原来是这样啊.那如果是文件在经过AES加密后变小了.这个正常不呢?为什么我解密出来的文件与原文件不匹配,会被截断一些字符!请高手指教啊,我用的C++