繁体   English   中英

C#TripleDES加密不良数据

[英]C# TripleDES encryption bad data

我要加密文件,将其保存到xml。 之后,我想读取xml,取出数据并解密并保存到文件。 我有加密和解密方法,但是当我尝试解密它时,出现了异常“错误数据”。 加密代码:

public string EncryptData(byte[] fileData, byte[] tdesKey, byte[] tdesIV)
        {
            MemoryStream msInput = new MemoryStream(fileData);
            MemoryStream msOutput = new MemoryStream();
            msOutput.SetLength(0);            

            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = msInput.Length;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            switch (mw.cmb_encryption_mode.Text)
            {
                case "ECB": tdes.Mode = CipherMode.ECB; break;
                case "CBC": tdes.Mode = CipherMode.CBC; break;
                case "CFB": tdes.Mode = CipherMode.CFB; break;
                case "OFB": tdes.Mode = CipherMode.OFB; break;
                default: break;
            }
            tdes.Padding = PaddingMode.PKCS7;
            tdes.Key = tdesKey;
            tdes.IV = tdesIV;
            CryptoStream encStream = new CryptoStream(msOutput, tdes.CreateEncryptor(), CryptoStreamMode.Write);
            mw.encryption_progress_bar.Maximum = totlen;

            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = msInput.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;

                mw.encryption_progress_bar.Dispatcher.Invoke(() => mw.encryption_progress_bar.Value = rdlen, System.Windows.Threading.DispatcherPriority.Background);
            }

            encStream.Close();
            byte[] resultArray = msOutput.GetBuffer();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

解密代码:

public byte[] DecryptData(byte[]encryptedData, byte[] tdesKey, Header header, byte[] tdesIV)
        {
            MemoryStream msInput = new MemoryStream(encryptedData);
            MemoryStream msOutput = new MemoryStream();
            msOutput.SetLength(0);

            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = msInput.Length;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            switch (header.cipherMode)
            {
                case "ECB": tdes.Mode = CipherMode.ECB; break;
                case "CBC": tdes.Mode = CipherMode.CBC; break;
                case "CFB": tdes.Mode = CipherMode.CFB; break;
                case "OFB": tdes.Mode = CipherMode.OFB; break;
                default: break;
            }
            tdes.Padding = PaddingMode.PKCS7;
            tdes.Key = tdesKey;
            tdes.IV = tdesIV;
            CryptoStream encStream = new CryptoStream(msOutput, tdes.CreateDecryptor(), CryptoStreamMode.Write);
            mw.decryption_progress_bar.Maximum = totlen;

            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = msInput.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;
                mw.decryption_progress_bar.Dispatcher.Invoke(() => mw.decryption_progress_bar.Value = rdlen, System.Windows.Threading.DispatcherPriority.Background);
            }            
            encStream.Close(); // <-exception

            return msOutput.GetBuffer();
        }

如果我使用ICryptoTransform和TransformFinalBlock函数对相同的数据进行加密和解密,则一切正常,但是我需要在每个处理的块的进度条上更新进度。 我无法弄清楚为什么它不起作用,我做错了什么吗?

我得到错误“错误数据”的原因是使用MemoryStream.GetBuffer()而不是MemoryStream.ToArray() ,就像James在评论中写道:

MemoryStream.GetBuffer()不是您想要的方法。 您需要MemoryStream.ToArray()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM