Отвечая на взаимодействия с файлами в C #? - PullRequest
2 голосов
/ 09 января 2010

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

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

Как я могу посмотреть файл и сделать это в C #? Могу ли я наблюдать за другими взаимодействиями, такими как пользователь, копирующий просматриваемый файл (поскольку он не будет находиться в просматриваемой папке, его следует расшифровать, т. Е. Перетащить на USB-устройство), или для удаления просматриваемого файла (например, если я хочу уничтожить файл перед удалением)?

P.S. FileSystemWatcher не совсем соответствует моим потребностям. РЕДАКТИРОВАТЬ: Я имею в виду, что FileSystemWatcher сообщит мне, когда файл открывается, удаляется и обо всех этих событиях, но он не позволит мне действительно быстро перейти, расшифровать файл и передать его обратно. к процессу, который обычно открывает этот файл.

Ответы [ 5 ]

2 голосов
/ 10 января 2010

Вы можете переименовывать файлы, добавлять их в собственное расширение, например thepicture.jpg.encrypted. Установите вашу программу в качестве программы по умолчанию для этого расширения и обработайте ее открытие

1 голос
/ 10 января 2010

Это невозможно в C #. Минимум требует, чтобы вы использовали хуки пользовательского режима для NtCreateFile, NtOpenFile и т. д. Вы не можете добиться этого в C #. Это даже не будет работать должным образом из-за кода режима ядра, который может пытаться получить доступ к вашим файлам. Правильный способ сделать это - написать минифильтр ввода / вывода (конечно, на С).

РЕДАКТИРОВАТЬ: Если вы действительно в отчаянии, попробуйте EasyHook - он позволяет вам перехватывать функции из C #. Я не пробовал это, хотя, и это кажется рискованным, перехватывая жизненно важные функции, такие как NtCreateFile. Кроме того, вам нужно немало знаний по собственному API.

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

Вы не можете сделать это из пользовательского режима.

К сожалению, единственный способ сделать это - написать драйвер для минифильтра. Драйверы Minifilter позволяют перехватывать запросы ввода-вывода к файлам, затем вы можете зашифровать / расшифровать файлы, которые вам нужны, на лету.

Звучит просто, но драйверы шифрования минифильтров очень, очень трудно понять. Вам придется в конечном итоге создать теневые файловые объекты, что является реальной проблемой. Обратитесь к www.osr.com, у них есть тонна информации о том, что именно вы хотите делать.

Если вы решите пойти по этому пути, я бы порекомендовал получить копию VMWare Workstation и загрузить VirtualKD. Это позволит вам отлаживать на скоростях, близких к скоростному, в виртуальную машину. Я хотел бы начать с 64-разрядной Win7 и получить удаленные общие папки, работающие в первую очередь.

0 голосов
/ 10 января 2010

Вместо того, чтобы изобретать велосипед, используйте шифрование файлов NTFS. Вы можете зашифровать отдельные файлы или целые папки или диски. Кроме того, он полностью прозрачен для пользователя и выполняет именно то, что вы просите (например, автоматически расшифровывает при копировании на диск UBS и т. Д.). Просто используйте System.IO.File.Encrypt(string) - не может быть ничего проще.

0 голосов
/ 09 января 2010

Вы используете Windows? Если так, то почему бы не использовать встроенный BitLocker?

См. Ссылку:

шифрование диска BitLocker

Если вы думаете о конкурентоспособном приложении для BitLocker, добавьте комментарий, так как я могу указать вам и в этом направлении.

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