Шифруем файлы в Делфи


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

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

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

Что ж, давайте теперь напишем свою программу для шифрования файлов и каталогов. Я не буду изобретать велосипед (хотя и мог бы, но данная статья всего лишь демонстрирует, как просто можно зашифровать буквально все).  Конечно, кто-то может с улыбкой сказать, что есть набор компонентов, которые могут позволить написать отличную программу даже новичку. Но зачем мы будем использовать эти компоненты, если можно задействовать средства Windows?

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

Итак, Windows, благодаря файловой системе NTFS, любезно предоставляет нам возможность очень легко зашифровать любой файл или каталог. Для этих целей в SDK входит замечательная функция EncryptFile.  Об ее применении можете прочитать в MSDN.  Однако скажу, что она предназначена для шифрования файлов. Хотя это утверждать нельзя, так как в тот же SDK входит функция DecryptFile, предназначенная для расшифровки файлов, зашифрованных EncryptFile. Ладно, хватит морочить вам голову. Давайте лучше напишем программу для шифрования/дешифрования файлов.

Откройте Delphi и создайте проект VCL Application. Я не буду делать изысканную форму, это вы можете сделать сами. Главное, показать вам весь алгоритм работы.

Закиньте на форму две кнопки, один текстбокс и OpenDialog. У меня это выглядит примерно так:

К сожалению (именно за это я не люблю Делфи и Vb), нам нужно вызвать вручную эти функции из библиотеки advapi32. В VC++ все гораздо проще – система автоматически  привязана к SDK. Ну что ж, привыкайте импортировать функции. Тем более, это очень пригодится нам, когда будем изучать C#.

Введите в разделе Var перед разделом implementation такие строки:

function EncryptFile(lpFilename: PChar): BOOL; stdcall; external advapi32 name 'EncryptFileA';
function DecryptFile(lpFilename: PChar; dwReserved: DWORD): BOOL; stdcall; external advapi32 name 'DecryptFileA';

Для тех, кто еще мало знаком с Делфи, поясню. Мы , так сказать, импортировали функции из библиотеки Windows advapi32.dll. Синтаксис предельно прост – указывается сигнатура функции (используйте справку Делфи для этого), затем ставится после точки с запятой ключевое слово stdcall, снова точка с запятой, после которой мы указываем, что используется функция EncryptFileA библиотеки advapi32.dll. С DecrypFile все аналогично.

Если не вписать эти строчки кода, Делфи рухнет и повесит ваш компьютер.

А теперь все просто – указываем через OpenDialog нужный нам файл и шифруем его функцией EncryptFile. Сделаем это. Для кнопки «Укажите файл» напишите код:

if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;

Мы получили нужный файл и теперь можем над ним извращаться. Для кнопки «Зашифровать» напишите следующий код:

If Edit1.Text='' then exit; // если поле пустое, то выходим из процедуры

If EncryptFile(pchar (Edit1.Text)) then //шифруем

ShowMessage ('Файл зашифрован!')

else

ShowMessage ('Чего-то не получилось. Попробуйте снова');

Здесь все просто – мы проверяем, введен ли файл для шифрования и если его нет, выходим из процедуры. Затем, если файл у нас есть, вызываем функцию шифрования, параметром которой передаем содержимое Edit1.Text. Обратите внимание, так как в сигнатуре функции указан PChar, нам нужно явным образом привести к нему нашу строковую переменную, что я и сделал в параметре. Так как EncryptFile имеет тип BOOL (не путать с Boolean, это просто означает 1 или 0,  так принято в мире Windows), то я могу воспользоваться этим и сделать проверку. Я пытаюсь зашифровать файл и если все отлично, то сообщаю об этом пользователю.

Скомпилируйте ваш проект и попытайтесь зашифровать понравившийся вам файл. Если все прошло успешно, то у файла появится атрибут – зашифрован. Он означает, что только вы в этой операционной системе можете его считать, причем  только войдя под своей учетной записью.  Попытайтесь открыть этот файл под другой учетной записью – система сообщит об отказе доступа.

Конечно, защита не ахти какая, но от глаз любопытных коллег ваши данные убережет.

С этим, думаю, разобрались. Теперь для кнопки «Расшифровать» скопируем предыдущий код, только вместо EncryptFile подставим DecryptFile, добавим вторым параметром 0, ну и подправим сообщение в ShowMessage. У меня это выглядит так:

If Edit1.Text='' then exit;

If DecryptFile(pchar (Edit1.Text),0) then

ShowMessage (Файл расшифрован!')

else

ShowMessage ('Что-то не получилось’);

Попробуйте расшифровать ранее зашифрованный файл. Атрибут «Зашифрован» должен исчезнуть.

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

Яндекс.Метрика