Я хочу зашифровать файл, сохранить его в 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, все работает хорошо, но мне нужно обновлять прогресс по мере выполнениябар каждый обработанный блок.Я не могу понять, почему это не работает, я что-то не так делаю?