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

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


Карманы а4

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

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