![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
kemiisto |
|
||||||||||||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Введение
http://ru.wikipedia.org/wiki/Криптография
Различают 3 группы криптографических алгоритмов: симметричные; ассиметричные; хэш-функций. Алгоритмы первых двух групп служат для обеспечения конфиденциальности информации, алгоритмы последней группы — для обеспечения аутентичности. Рано или поздно в жизни почти каждого программиста встаёт задача обеспечения конфиденциальности или аутентичности определённой информации. Не будучи специалистом в криптографии, большинство предпочитает использовать уже готовые алгоритмы. Но где же взять исходный код или компонент, обеспечивающий необходимую функциональность? Ответов может быть множество. В данной статье я расскажу об одной интересной библиотеке. Итак, встречаем DCPcrypt Cryptographic Component Library v2 Beta 3. Взять библиотеку можно тут. Первое что бросается в глаза — открытость библиотеки (open source software). Установка 1. Заходим по адресу http://www.cityinthesky.co.uk/cryptography.html и качаем архив DCPcrypt v2 Beta 3. Прямая ссылка 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), но даже сам разработчик считает не лишним явный вызов этого метода. Для расшифрования строки используйте что-то наподобие:
Зашифрование/расшифрование файла:
Не забудем и про хеширование, основное применение которого — сверка данных. Итак, для проверки на наличие ошибок (при передаче файла или во время хранения) нам необходимо уметь считать контрольную хэш-сумму файла:
Как Вам уже должно быть известно, в большинстве случаев парольные фразы не хранятся на целевых объектах, хранятся лишь их хеш-значения. В ходе процедуры аутентификации вычисляется хеш-значение введённой парольной фразы, и сравнивается с сохранённым. Так что подсчёт хэш-суммы строки тоже может пригодиться:
Думаю, Вы заметили небольшой нюанс: вычисляемая хэш-сумма представляет собой массив байтов. Для приведения к «нормальному» строковому виду я использую небольшую дополнительную функцию:
Ну и наконец, скажу пару слов об основном преимуществе описываемой библиотеки. Все алгоритмы шифрования — наследники TDCP_cipher, а хэширования — наследники TDCP_hash. Поэтому, если по какой-либо причине Вам захочется изменить алгоритм, это делается минимальными изменениями кода. Например, в нашей первой функции:
изменим алгоритм шифрования с AES(Rijndael) на 3DES:
Надеюсь, статья окажется полезной. Удачи! ![]() P.S. В аттаче статья в PDF. Это сообщение отредактировал(а) kemiisto - 11.7.2008, 13:27 -------------------- |
||||||||||||||||||||
|
|||||||||||||||||||||
Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: нет Всего: 39 |
Это откуда? и в какую из этих групп отнести MACи? В какую ЭЦП? |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Википедия
Если Вы не заметили, статья называется не "Введение в криптографию". Она посвящена использованию конкретной библиотеки. Я в начале дал ссылочку на народную энциклопедию. В этой статье есть информация и про электронную цифровую подпись. Зачем же сюда копи-пастить? -------------------- |
|||
|
||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Как раз вчера работал с этой либой... Так что возьму на себя смелость немного расширить статью
![]() В качестве ключа я использовал не хэш от строки, а свой готовый 256-байтный ключ, записанный в строку. Кроме того, у меня могут использоваться два ключа - для демо и про версий. В таком раскладе легко ошибиться при передаче ключа методу Init - простое копирование ключа в локальную строковую переменную не катит.
Как уже упоминалось, разумнее не засорять IDE компонентами, а напрямую подключить модули к проге. В uses требуется только один файл, и он тянет за собой ещё всего три: DCPbase64 DCPconst DCPcrypt2 |
|||
|
||||
Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: нет Всего: 39 |
Зачем тогда вообще в статье это введение, тем более информация в нем не совсем соотвествует действительности. В той же вики, такого не написано - вчитайтесь внимательно. Вы, вероятно, хотели сказать расшифрования. Я не настаиваю на исправлении. Не хотите - не исправляйте. Тут дело каждого - писать грамотно, или нет. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
"Дешифрование" - это правильно написано. Появилось это слово от decrypt и значит то же самое, что и "расшифрование". Alexandr87, не придирайтесь.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: нет Всего: 39 |
Poseidon, для вас может быть и нет разницы, а вообще расшифрование и дешифрование это два совершенно разных процесса.
http://ru.wikipedia.org/wiki/%D0%9A%D1%80%....B3.D0.B8.D1.8F Я не придираюсь - я поправляю. |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Alexandr87, ну это всё тонкости перевода. Моему слуху приятнее шифрование/дешифрование, а не зашифрование/расшифрование. Вы же прекрасно понимаете, что имеется в виду. А значит, придираетесь.
![]() -------------------- |
|||
|
||||
Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: нет Всего: 39 |
Ваша компетентность в данном вопросе мне понятна.
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
Alexandr87, приношу Вам свои извинения.
Вы действительно правы. Терминология вещь сугубо важная. Проблема в том, что я ознакомился с ней по электронной книге Брюс Шнайер - Прикладная криптография, 2-е изд. Как оказалось, это так сказать "левый" перевод. Вот ссылка о качестве этого перевода: http://www.ssl.stu.neva.ru/psw/crypto/appl_rus/appl_cryp.htm. Ещё раз приношу Вам извинения. -------------------- |
|||
|
||||
vzf |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 10.9.2005 Репутация: нет Всего: 5 |
Абсолютно согласен с критикой Alexandr87.
Вот это :
не верно и даже в приведенной статье в википедии об этом не говорится. А книжку под редакцией Семьянова думаю стоит почитать, если интересует вопрос, думаю хорошая книжка, т.к. сам он специалист в своем деле ![]() --------------------
Java - Write Once, Test EveryWhere! |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 16 Всего: 160 |
vzf, я не против критики. Но критики конструктивной. Если Вы специалист - подскажите как написать правильно и я исправлю. А то:
И что дальше? Исправить на:
Так, видимо, правильно? Время... Где б его взять... -------------------- |
|||
|
||||
vppm |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 14.9.2009 Репутация: нет Всего: нет |
Alexandr87
от вашей неуместной критики пользы читателю - ноль, а автору - спасибо! |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Пользуюсь этой библиотекой не первый год. Лучшее, что приходилось использовать в плане удобоваримости, настраиваемости и т.п. По моим тестам самый быстрый из всех cipher-ов это TDCP_blowfish.
Имхо, в статье нехватает нескольких фраз про crypt|decrypt: расшифровка должна идти в том же порядке, что и шифрование. то есть, если сделать
то в том же порядке нужно вызывать и decrypt. Если поменять порядок - результат будет совсем не тот, который ожидается. Если данные могут расшифровываться в другом порядке (как пример - если зашифрованные данные передаются по UDP), то после каждого Encrypt (и естественно - после decrypt) нужно выполнять Reset. Правда, толку тогда от стойкого алгоритма поубавится. |
|||
|
||||
ikrom |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
Добрый день!
Помогите, пожалуйста, решить одну проблемку: Есть БД Mysql- таблица 'пользователи' в котором через PHP (web приложение) захэшированы пароли пользователей, теперь через Delphi (Window приложение) нужно путем запроса проверять сходства между вводимым пользователем пароль и захэшированного пароля в таблице. Как захэшировать в sha1 вводимый пользователем в Edit текст, в Delphi? Заранее благодарен! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |