Проблема с шифрованием и расшифровкой файлов - PullRequest
4 голосов
/ 11 июля 2010

Я играл с шифрованием и дешифрованием файлов в VC # Express 2010.

Все учебники и документация, которые я видел, требуют два FileStream с для шифрования файла - один для чтения незашифрованной версии, а другой для шифрования. Когда я фактически писал код, он продолжал выдавать ошибку, сообщая, что не может открыть файл, потому что он был открыт другим процессом в выходном файловом потоке.

Я предполагаю, что это потому, что файл открывается входным потоком файлов. Значит, мне нужно указать другое имя файла? Таким образом, даже после успешной операции у меня теперь будет оригинальный незашифрованный файл в каталоге и отдельная зашифрованная версия? Разве это не победит суть? Или я что-то здесь не так делаю? Мой код похож на этот ...

public string filename = "test.xml";
using (FileStream input = new FileStream(filename, FileMode.Open, FileAccess.Read))
using (FileStream output = new FileStram(filename, FileMode.Open, FileAccess.Write))
using (....all the crypto stream and transform stuff...)
{
    ...do the encryption....
}

Ответы [ 4 ]

3 голосов
/ 11 июля 2010

Ты прав, но дело не в победе. (Потоковые) крипто-API предназначены для шифрования от Src до Dst. Подумайте о шифровании вывода при отправке / получении по сети и т. Д. Это делает их простыми, как и должно быть.

Вы усложняете проблему, используя один и тот же файл для Src и Dst. Это не совсем невозможно, но, как и копирование файла поверх самого себя, оно требует особой осторожности.

Учтите, что в целом шифрование увеличивает размер файла. Так что Шифровать файл на месте небезопасно. Расшифровка может быть, но я бы не стал рисковать.

Вам нужен временный файл и действие переименования после завершения.

1 голос
/ 11 июля 2010

В вашем примере вы не можете создать отдельный файловый поток для ввода и вывода для одного и того же файла, но вы можете создать дескриптор, который будет читать и записывать.Перечисление FileAccess имеет атрибут flags, поэтому вы просто скажете var handle = new FileStream(filename, FileAccess.Read | FileAccess.Write); Очевидным недостатком этого является потеря данных, если ваше шифрование не завершится успешно.файл для вывода, хотя бы таким образом вы не потеряете данные, если ваша программа неожиданно сломается.Если шифрование успешно завершено, удалите оригинал и переименуйте зашифрованный файл с именем оригинального файла.

0 голосов
/ 11 июля 2010

Существует еще один параметр, в котором вы можете указать, разрешить ли другому процессу чтение или запись в файл.

openFile - это строка, представляющая имя файла.

using (FileStream fileIn = new FileStream(openFile, FileMode.Open, FileAccess.Read, FileShare.Write))
using (FileStream fileOut = new FileStream(openFile, FileMode.Open, FileAccess.Write, FileShare.Open))

Таким образом, вы можете читать и писать в один и тот же файл.

while (myfileStream.Position < fileLength)
{   
    fileIn.Read(buffer, 0, 51200);    
    buffer = encrypt(buffer);    
    fileOut.Write(buffer, 0, 51200);                      
}

Хотя это легко и вам не нужно записывать во временный файл или перемещать / переименовывать и т. Д., Этоможет быть очень опасным, потому что если по какой-то причине шифрование внезапно прекратится, вы потеряете данные!

Кроме того, функцию encrypt я реализовал.AesCryptoServiceProvider вместе с CryptoStream можно использовать:)

0 голосов
/ 11 июля 2010

Используйте File.ReadAllBytes.Затем эти байты, отправленные на ваш шифратор, должны работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...