[英]C# TripleDES encryption bad data
I want to encrypt a file, save it to an xml. 我要加密文件,将其保存到xml。 After that i want to read the xml get out the data and decrypt it and save to file.
之后,我想读取xml,取出数据并解密并保存到文件。 I've got encryption and decryption method but when I try to decrypt it I got an exception "Bad data".
我有加密和解密方法,但是当我尝试解密它时,出现了异常“错误数据”。 Encryptin code:
加密代码:
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);
}
Decryption code: 解密代码:
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();
}
If I encrypt and decrypt the same data using ICryptoTransform and TransformFinalBlock function, everything works well, but i need to update progress on progress bar every processed block. 如果我使用ICryptoTransform和TransformFinalBlock函数对相同的数据进行加密和解密,则一切正常,但是我需要在每个处理的块的进度条上更新进度。 I cant figure it out why it doesnt work, is there something im doing wrong?
我无法弄清楚为什么它不起作用,我做错了什么吗?
Reason why I got error "Bad data" was using MemoryStream.GetBuffer()
instead of MemoryStream.ToArray()
just as James wrote in comment: 我得到错误“错误数据”的原因是使用
MemoryStream.GetBuffer()
而不是MemoryStream.ToArray()
,就像James在评论中写道:
MemoryStream.GetBuffer() is not the method you want.
MemoryStream.GetBuffer()不是您想要的方法。 You want MemoryStream.ToArray().
您需要MemoryStream.ToArray()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.