[英]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.