Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > DCPcrypt — криптография в Delphi. |
Автор: kemiisto 9.7.2008, 11:44 | ||||||||||||||||||||
Введение http://ru.wikipedia.org/wiki/Криптография
Различают 3 группы криптографических алгоритмов: http://ru.wikipedia.org/wiki/Алгоритм_с_симметричным_ключом; http://ru.wikipedia.org/wiki/Криптосистема_с_открытым_ключом; http://ru.wikipedia.org/wiki/Хэш-функция. Алгоритмы первых двух групп служат для обеспечения конфиденциальности информации, алгоритмы последней группы — для обеспечения аутентичности. Рано или поздно в жизни почти каждого программиста встаёт задача обеспечения конфиденциальности или аутентичности определённой информации. Не будучи специалистом в криптографии, большинство предпочитает использовать уже готовые алгоритмы. Но где же взять исходный код или компонент, обеспечивающий необходимую функциональность? Ответов может быть множество. В данной статье я расскажу об одной интересной библиотеке. Итак, встречаем DCPcrypt Cryptographic Component Library v2 Beta 3. Взять библиотеку можно http://www.cityinthesky.co.uk/cryptography.html. Первое что бросается в глаза — открытость библиотеки (open source software). Установка 1. Заходим по адресу http://www.cityinthesky.co.uk/cryptography.html и качаем архив DCPcrypt v2 Beta 3. Прямая ссылка http://www.cityinthesky.co.uk/files/dcpcrypt2.zip. 2. Распаковываем содержимое архива в какую-нибудь папку. Я предпочитаю сторонние компоненты и библиотеки хранить в подпапках папки С:\Program Files\Borland\Delphi7\Lib\. Добавляем путь к созданной пакпе и её двум подпапкам Ciphers и Hashes в Library Path (в Delphi 7 в главном меню Tools — Enviroment Options, вкладка Library). 3. Открываем нужный пакет и устанавливаем (для Delphi 6-ой версии и выше выбираем DCPdelphi6.dpk). Использование После установки можно выбрать необходимый компонент с вкладки DCPciphers или DCPhashes, бросит его на форму и использовать. Но, так как компоненты невизуальные, я (как собственно и автор компонентов) предпочитаю использовать иной подход. Просто добавьте нужный модуль в раздел uses и используйте подпрограммы аналогичные тем, что я приведу ниже. В приведённых фрагментах в uses добавлены модули DCPrijndael и DCPsha1. Для зашифрования строки используёте функцию наподобие той, что описана ниже:
В принципе можно не вызывать метод Burn, т.к. он будет вызван автоматически при уничтожении объекта (Free), но даже сам разработчик считает не лишним явный вызов этого метода. Для расшифрования строки используйте что-то наподобие:
Зашифрование/расшифрование файла:
Не забудем и про хеширование, основное применение которого — http://ru.wikipedia.org/wiki/Хэш-функция#.D0.A1.D0.B2.D0.B5.D1.80.D0.BA.D0.B0_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85. Итак, для проверки на наличие ошибок (при передаче файла или во время хранения) нам необходимо уметь считать контрольную хэш-сумму файла:
Как Вам уже должно быть http://ru.wikipedia.org/wiki/Хэш-функция#.D0.A1.D0.B2.D0.B5.D1.80.D0.BA.D0.B0_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85, в большинстве случаев парольные фразы не хранятся на целевых объектах, хранятся лишь их хеш-значения. В ходе процедуры аутентификации вычисляется хеш-значение введённой парольной фразы, и сравнивается с сохранённым. Так что подсчёт хэш-суммы строки тоже может пригодиться:
Думаю, Вы заметили небольшой нюанс: вычисляемая хэш-сумма представляет собой массив байтов. Для приведения к «нормальному» строковому виду я использую небольшую дополнительную функцию:
Ну и наконец, скажу пару слов об основном преимуществе описываемой библиотеки. Все алгоритмы шифрования — наследники TDCP_cipher, а хэширования — наследники TDCP_hash. Поэтому, если по какой-либо причине Вам захочется изменить алгоритм, это делается минимальными изменениями кода. Например, в нашей первой функции:
изменим алгоритм шифрования с AES(Rijndael) на 3DES:
Надеюсь, статья окажется полезной. Удачи! ![]() P.S. В аттаче статья в PDF. |
Автор: Alexandr87 9.7.2008, 13:39 | ||
Это откуда? и в какую из этих групп отнести MACи? В какую ЭЦП? |
Автор: kemiisto 9.7.2008, 13:58 | ||
http://ru.wikipedia.org/wiki/Криптография#.D0.A1.D0.BE.D0.B2.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D0.BD.D0.B0.D1.8F_.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.BE.D0.B3.D1.80.D0.B0.D1.84.D0.B8.D1.8F
Если Вы не заметили, статья называется не "Введение в криптографию". Она посвящена использованию конкретной библиотеки. Я в начале дал ссылочку на народную энциклопедию. В этой статье есть информация и про электронную цифровую подпись. Зачем же сюда копи-пастить? |
Автор: December 9.7.2008, 14:13 | ||
Как раз вчера работал с этой либой... Так что возьму на себя смелость немного расширить статью ![]() В качестве ключа я использовал не хэш от строки, а свой готовый 256-байтный ключ, записанный в строку. Кроме того, у меня могут использоваться два ключа - для демо и про версий. В таком раскладе легко ошибиться при передаче ключа методу Init - простое копирование ключа в локальную строковую переменную не катит.
Как уже упоминалось, разумнее не засорять IDE компонентами, а напрямую подключить модули к проге. В uses требуется только один файл, и он тянет за собой ещё всего три: DCPbase64 DCPconst DCPcrypt2 |
Автор: Poseidon 10.7.2008, 08:40 |
"Дешифрование" - это правильно написано. Появилось это слово от decrypt и значит то же самое, что и "расшифрование". Alexandr87, не придирайтесь. |
Автор: Alexandr87 10.7.2008, 11:57 |
Poseidon, для вас может быть и нет разницы, а вообще расшифрование и дешифрование это два совершенно разных процесса. http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F#.D0.A2.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D0.BE.D0.BB.D0.BE.D0.B3.D0.B8.D1.8F Я не придираюсь - я поправляю. |
Автор: kemiisto 10.7.2008, 12:25 |
Alexandr87, ну это всё тонкости перевода. Моему слуху приятнее шифрование/дешифрование, а не зашифрование/расшифрование. Вы же прекрасно понимаете, что имеется в виду. А значит, придираетесь. ![]() |
Автор: Alexandr87 10.7.2008, 12:51 |
Ваша компетентность в данном вопросе мне понятна. |
Автор: kemiisto 11.7.2008, 13:33 |
Alexandr87, приношу Вам свои извинения. Вы действительно правы. Терминология вещь сугубо важная. Проблема в том, что я ознакомился с ней по электронной книге Брюс Шнайер - Прикладная криптография, 2-е изд. Как оказалось, это так сказать "левый" перевод. Вот ссылка о качестве этого перевода: http://www.ssl.stu.neva.ru/psw/crypto/appl_rus/appl_cryp.htm. Ещё раз приношу Вам извинения. |
Автор: vzf 4.9.2008, 19:42 | ||
Абсолютно согласен с критикой Alexandr87. Вот это :
не верно и даже в приведенной статье в википедии об этом не говорится. А книжку под редакцией Семьянова думаю стоит почитать, если интересует вопрос, думаю хорошая книжка, т.к. сам он специалист в своем деле ![]() |
Автор: kemiisto 23.9.2008, 14:58 | ||
vzf, я не против критики. Но критики конструктивной. Если Вы специалист - подскажите как написать правильно и я исправлю. А то: И что дальше? Исправить на:
Так, видимо, правильно? Время... Где б его взять... |
Автор: vppm 25.9.2009, 12:32 |
Alexandr87 от вашей неуместной критики пользы читателю - ноль, а автору - спасибо! |
Автор: kami 25.9.2009, 20:14 | ||
Пользуюсь этой библиотекой не первый год. Лучшее, что приходилось использовать в плане удобоваримости, настраиваемости и т.п. По моим тестам самый быстрый из всех cipher-ов это TDCP_blowfish. Имхо, в статье нехватает нескольких фраз про crypt|decrypt: расшифровка должна идти в том же порядке, что и шифрование. то есть, если сделать
то в том же порядке нужно вызывать и decrypt. Если поменять порядок - результат будет совсем не тот, который ожидается. Если данные могут расшифровываться в другом порядке (как пример - если зашифрованные данные передаются по UDP), то после каждого Encrypt (и естественно - после decrypt) нужно выполнять Reset. Правда, толку тогда от стойкого алгоритма поубавится. |
Автор: ikrom 1.10.2009, 11:53 |
Добрый день! Помогите, пожалуйста, решить одну проблемку: Есть БД Mysql- таблица 'пользователи' в котором через PHP (web приложение) захэшированы пароли пользователей, теперь через Delphi (Window приложение) нужно путем запроса проверять сходства между вводимым пользователем пароль и захэшированного пароля в таблице. Как захэшировать в sha1 вводимый пользователем в Edit текст, в Delphi? Заранее благодарен! |
Автор: loveisafix 16.11.2009, 00:33 | ||
Здравствуйте, уважаемые! имеется хеш вида EE5B0E48C8FE97716D. Исходная строка - "1234". Известно что фиксированный ключ был такого вида: 23 82 107 6 35 78 88 7 при помощи примера в статье пытаюсь сгенерировать такой же хеш.
Ничего не выходит. Только короткая строка "Eck4fQ=="... Как быть.. Если кто-то может помочь - буду рад! Заранее спасибо! С уважением Дмитрий. loveisafix ЭТ gmail.com |
Автор: Georg97 15.5.2013, 15:06 |
Ошибка UI в переменнjой Self what's up? |
Автор: ReGeDiT 29.12.2013, 04:43 | ||||||
такая-же возня ) наверное, так-же используете версию Делфи около 2009-2010... глупо, конечно, но лечится это довольно просто:
или объявить Self:
хрен его знает, будет ли работать = Delphi сыпит warnings |