CAPTCHA.ru
Что такое CAPTCHA
Статьи
Алгоритмы
MultiSwirl
MultiWave
Примеры взлома
Проект KCAPTCHA
Ссылки
Отблагодарить
English

Программный код CAPTCHA на PHP


Полиграфия у нас http://kolibry-print.com/.

Системные требования

ImageMagick

MultiSwirl

Алгоритм Swirl (похож на Twirl из Photoshop) пакета ImageMagick производит закручивание изображение вокруг центра на некоторый угол:


Swirl на 100°

Видно, что достигается достаточно сильное искажение первоначального рисунка, с сохранением, однако, читабельности. Правда, преобразование Swirl обратимо. Это значит, что, если мы над искаженным изображением проведем обратную операцию (в данном случае повернем на -100°), получится исходная, неискаженная картинка.


Swirl обратно (на -100°)

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

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

Практика показывает, что достаточно двух искажений, чтобы значительно запутать возможного взломщика. Эти два поворота лучше делать в противоположных направлениях, чтобы не слишком "закручивать" результат в ущерб читаемости человеком.

Вот отлаженный код для ImageMagick (Для понятности код разделен на строки и снабжен комментариями. Реальная консольная команда должна быть написана без комментариев и в одну строку)

convert -size 300x100 xc:white # поле 300x100, белого цвета, 
-type TrueColor -antialias -fill black # печатаем черным с антиалиасингом...
-font times.ttf -pointsize 70 -draw 'text 20,70 "STRING"' # строку STRING шрифтом times.ttf 70-ым
-extent 400x120 -roll +101+4 # подвинуть центр влево на 100 точек +случайная флуктуация
-swirl 40 # первый swirl на случайный угол (от 37 до 51)
-extent 600x140 -roll +3-4 # подвинуть центр вправо на 200 точек, тоже со случайной флуктуацией
-swirl -30 # второй поворот (от 20 до 35)
-crop 300x100+100+17 +repage -resize 150x50 gif:- # окончательная обработка и вывод в stdout

Вот результат (нажмите кнопку "Обновить" рядом с картинкой для перегенерации):



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



© Круглов Сергей. Опубликованные на сайте алгоритмы можно свободно использовать и модифицировать.
Система управления сайтом CAPTCHA.ru: Managee