1

我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<dskh>
  <khachhang maso="kh01">
    <ten_kh>thehung</ten_kh>
    <tuoi_kh>15</tuoi_kh>
    <dchi_kh>hochiminh</dchi_kh>
  </khachhang>
  <khachhang maso="kh02">
    <ten_kh>hung</ten_kh>
    <tuoi_kh>15</tuoi_kh>
    <dchi_kh>hcm</dchi_kh>
  </khachhang>
</dskh>

我的加密和解密代码:

class Program
{
    //  Call this function to remove the key from memory after use for security.
    [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
    public static extern bool ZeroMemory(ref string Destination, int Length);

    // Function to Generate a 64 bits Key.
    static string GenerateKey()
    {
        // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
        DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

        // Use the Automatically generated key for Encryption. 
        return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }

    static void EncryptFile(string sInputFilename,
        string sOutputFilename,
        string sKey) {
        FileStream fsInput = new FileStream(sInputFilename,FileMode.Open,FileAccess.Read);
        FileStream fsEncrypted = new FileStream(sOutputFilename,FileMode.Create,FileAccess.Write);
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = Encoding.UTF8.GetBytes(sKey);
        DES.IV = Encoding.UTF8.GetBytes(sKey);
        ICryptoTransform desencrypt = DES.CreateEncryptor();
        CryptoStream cryptostream = new CryptoStream(fsEncrypted,desencrypt,CryptoStreamMode.Write);
        byte[] bytearrayinput = new byte[fsInput.Length - 1];
        fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    }

    static void DecryptFile(string sInputFilename,
                        string sOutputFilename,
                        string sKey)
    {
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        //A 64 bit key and IV is required for this provider.
        //Set secret key For DES algorithm.
        DES.Key = Encoding.UTF8.GetBytes(sKey);
        //Set initialization vector.
        DES.IV = Encoding.UTF8.GetBytes(sKey);

        //Create a file stream to read the encrypted file back.
        FileStream fsread = new FileStream(sInputFilename,
                                       FileMode.Open,
                                       FileAccess.Read);
        //Create a DES decryptor from the DES instance.
        ICryptoTransform desdecrypt = DES.CreateDecryptor();
        //Create crypto stream set to read and do a 
        //DES decryption transform on incoming bytes.
        CryptoStream cryptostreamDecr = new CryptoStream(fsread,
                                                     desdecrypt,
                                                     CryptoStreamMode.Read);
        //Print the contents of the decrypted file.
        StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
        fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
        fsDecrypted.Flush();
        fsDecrypted.Close();
    }

    static void Main(string[] args)
    {
        // Must be 64 bits, 8 bytes.
        // Distribute this key to the user who will decrypt this file.
        string sSecretKey;

        // Get the key for the file to encrypt.
        sSecretKey = GenerateKey();

        // For additional security pin the key.
        GCHandle gch = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned);

        // Encrypt the file.        
        EncryptFile(@"C:\xml_kh.xml",
          @"C:\xml_encry.xml",
           sSecretKey);

         //Decrypt the file.
        DecryptFile(@"C:\xml_encry.xml",
           @"C:\xml_decry.xml",
           sSecretKey);
    }
}

当我执行解密代码时,我得到Cryptographicexception: Bad Data here:

//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();

请帮我!!!

4

1 回答 1

0

EncryptFile在函数末尾添加两行:

cryptostream.Flush();
cryptostream.Close();

编辑

我错过了还有一个错误:

byte[] bytearrayinput = new byte[fsInput.Length - 1];

s/b

byte[] bytearrayinput = new byte[fsInput.Length];
于 2013-01-23T13:52:37.907 回答