Мы шифруем все типы файлов, используя шифрование Rijndael.Более новые файлы .xlsx и .docx выдают ошибки при попытке открытия (после шифрования и попытки расшифровки).Ошибка при попытке открыть файл в Excel 2003: «Конвертеру не удалось открыть файл».У меня установлено приложение Excel, и когда я не использую шифрование / дешифрование, я могу открыть файлы xlsx в Excel 2003.
Я изменил код для использования AES с тем же типом проблемы (но в этом случаефайл не загружается, он просто находится в списке загрузки Firefox).Я прочитал предложения здесь, чтобы обратить внимание на размер / длину в байтах зашифрованных / дешифрованных файлов, но затрудняюсь с тем, как это исправить, я вижу, что если я загружаю файл xls, длина зашифрованного файла будет другойиз дешифрованного файла выходит и xls сохраняет и открывает нормально, так что я не знаю, как проверить, является ли это проблемой, так как эти длины различаются для файлов, которые работают.Я включил код, чтобы увидеть, если кто-то может обнаружить какие-либо проблемы, которые могут способствовать ошибкам шифрования файлов xlsx / docx.Я свернул код, поэтому, возможно, из-за синтаксических ошибок.
Я установил Excel 2007, чтобы посмотреть, откроются ли файлы .xlsx, которые зашифрованы и расшифрованы, в Excel 2007.При попытке открыть файл я получаю приглашение: «Excel обнаружил нечитаемый контент в« myfile.xlsx ». Хотите восстановить содержимое этой книги?».Excel 2007 может восстанавливать / восстанавливать файл с сообщением: «Excel завершил проверку и восстановление на уровне файлов. Некоторые части этой книги могли быть отремонтированы или удалены».Таким образом, шифрование / дешифрование создает недопустимый файл, но Excel 2007 способен исправить это;Конвертер Excel 2003 ничего не может сделать с файлом.
public byte [] Encrypt(byte [] bytes)
{
if (myRijndael == null)
myRijndael = new RijndaelManaged();
ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, IV);
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
csEncrypt.Write(bytes, 0, bytes.Length);
csEncrypt.FlushFinalBlock();
return msEncrypt.ToArray();
}
public byte [] Decrypt(byte [] encrypted, string text)
{
if (myRijndael == null)
{
myRijndael = new RijndaelManaged();
}
ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, IV);
MemoryStream msDecrypt = new MemoryStream(encrypted);
CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
byte [] fromEncrypt = new byte[encrypted.Length];
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
return fromEncrypt;
}
Usage:
ENCRYPT:
ClcCrypto crypt; // Our class for saving keys etc.
ClcCrypto(CLC.WebUtil.ClcCrypto.GetDecryptionKey(), Group.IV);
BinaryReader br = new BinaryReader(NewFile);// NewFile is Stream from filMyFile.PostedFile.InputStream
byte[] EncryptedContents = crypt.Encrypt(br.ReadBytes((int)NewFile.Length));
FileStream fs = File.Create(DestFileName);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(EncryptedContents);
bw.Close();
fs.Close();
br.Close();
DECRYPT (file download):
byte[] baOut = null;
baOut = fiOut.GetFileData(out lLength); // See below for method
Response.AddHeader("content-disposition", "attachment; filename=" + FileName));
Response.ContentType = fiOut.MimeType;
Response.AddHeader("content-length", lLength.ToString());
Response.BinaryWrite(baOut);
Response.End();
public byte[] GetFileData(out long intFileSize)
{
FileStream fsOut = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
intFileSize = fsOut.Length;
byte[] Buffer = null;
ClcCrypto crypt;
crypt = new CLC.WebUtil.ClcCrypto(CLC.WebUtil.ClcCrypto.GetDecryptionKey(), IV);
BinaryReader br = new BinaryReader(fsOut);
Buffer = crypt.Decrypt(br.ReadBytes((int)fsOut.Length), null);
br.Close();
fsOut.Close();
return Buffer;
}