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


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

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

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

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

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

Комментарии

19 комментариев на “Шифруем файлы в Делфи”
  1. Дмитрий:

    Я пробовал эту программку,она не шифрует!как запускается фаил так и запускается)

  2. admin:

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

  3. Дмитрий:

    я просто,взял зашифрованый фаил!и перенёс на виртуалку)он всё равно запустился.

  4. admin:

    У него стоит атрибут зашифрован?

  5. Дмитрий:

    Хотите верьте хотите нет,нет не стоит)цвет тока зилёный?

  6. admin:

    Раз зеленый — это зашифрован. Странно, я сейчас проверил семь различных файлов — архивы, текстовые, djvu, mp4 и mp3 — запускал их под виртуалкой и под другими учетными записями, а также на ноуте с семеркой — пишет то, что и должен — отказано в доступе к файлу.
    Попробуйте все же создать другую учетную запись и запустить файл там.
    Я скоро опубликую штук сорок статей по Делфи и покажу, как правильно шифровать файлы.
    Сегодня, надеюсь, дойдут руки до программы, прячущей/открывающей раздел диска.

  7. Дмитрий:

    Спасибо большое!!!

  8. Дмитрий:

    Здравствуйте!а можно-ли таким образом спрятать фаил?

  9. admin:

    От чего спрятать? Если от людей, то нужно просто еще добавить функцию смены атрибутов. Вопрос не совсем понял

  10. Дмитрий:

    да от людей)))а как его потом вернуть назад???

  11. Роман Юрьевич:

    Получилось только с фалами, которые лежат на жесткаче, а с сетевого диска не хочет, но всеравно спасибо!

  12. Роман Юрьевич:

    Кстати, у меня у одного не копирует текст (сижу с Хрома)?

    • Вячеслав "VeGA" Головлев:

      Нет, он ни у кого не копируется. На блоге стоит защита от копирования. Прошу прощения за вызванные неудобства. Просто в начале работы блога столкнулся с наглым воровством моего контента, поэтому пришлось прибегнуть к столь непопулярным мерам.

  13. Вячеслав "VeGA" Головлев:

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

  14. alyan:

    какой алгоритм шифрования используется? что-то не могу разобраться

    • admin:

      Вопрос на внимательность — статью хорошо прочитали? Или сразу смотрели на код?

  15. вероника скиба:

    Составте программу шифрования текстового сообщения. Можно использовать такой метод шифровки. Шифровальщик( пользователь ) задает ключ шифровки -целое число,кторое определяет величину смещения букв русского алфавита,например ключ=3.,тогда в тексте буква «а» заменяется на «г» и т.д. Используютя все буквы русского алфавита.

    • admin:

      Это че за прикол такой? У меня не форум, где какой-нибудь задрот что-либо напишет. Блог веду я и только мне решать,что делать. Что за такой коммент никчемный? Ни здрасте, ни просьба.
      Кто прочтет мой ответ, знайте -в следующий раз буду сразу стирать все

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: