IT-инфраструктура для бизнеса и творчества

Разработчик создал инструмент Depix, который восстанавливает «пиксельный» текст в документах и скриншотах Статьи редакции

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

Иногда требуется отправить скриншот, на котором есть личные данные: пароли или данные банковской карты. Чтобы скрыть лишнюю информацию, компании и пользователи размывают или пикселизируют информацию, а не закрашивают её.

Теперь это может быть небезопасно. Специалист по информационной безопасности Сипке Меллема разработал инструмент на базе Python, позволяющий восстановить пикселизованный текст на изображении и опубликовал его на Github.

Сверху вниз: пикселизированный текст, восстановленный и оригинальный

Что делает Depix

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

Фильтр разбивает картинку на области и перезаписывает данные о пикселях в каждой

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

На входе Depix получает пикселизированное изображение (то, на которое нужно расшифровать) и алфавит, набранный похожим шрифтом. Затем алгоритм пикселизирует алфавит и ищет совпадающие блоки пикселей.

В качестве алфавита Depix использует последовательность де Брёйна: в ней уникальна любая комбинация символов.

Так выглядит последовательность де Брёйна

Сначала алгоритм находит один совпадающий блок, а затем подбирает похожие соседние блоки, которые находятся на том же расстоянии, что и на исходном изображении.

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

Для блоков с несколькими совпадениями алгоритм выведет средние значения.

Как воспользоваться Depix

  • Установить Python.
  • Скачать Depix (Code → Download .zip).
  • Вырезать прямоугольный пикселизированный кусок из нужного изображения.
  • Сгенерировать последовательность де Брёйна с предполагаемыми символами и создать файл с теми же настройками шрифта, что и в пикселизованном фрагменте (размер, цвет, шрифт, цветовая модель HSL).
  • Сделать скриншот последовательности де Брёйна, по возможности — тем же инструментом, которым создавался пикселизованный текст.
  • Запустить в Python код python depix.py -p [название пикселизированного куска изображения] -s [образец алфавита] -o output.png
  • Готовый результат будет в изображении output.png

Чтобы было проще разобраться в работе алгоритма, автор приводит готовый пример строки. Его можно запустить сразу после скачивания Depix и посмотреть в работе.

python depix.py -p images/testimages/testimage3_pixels.png -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png

Как защитить изображения

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

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

(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ { name: 'camera', url: `${cdnUrl}CameraCat`, text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', link: 'https://vc.ru/selectel/306690', num: 3 }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', num: 1 }, { name: 'cloud', url: `${cdnUrl}CloudCat`, text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', link: 'https://vc.ru/dev/294799-maneki-neko', num: 2 } ] let buttonCycle = document.querySelector('.button--cycle') let buttonChoose = document.querySelector('.button--choose') let buttonMobile = document.querySelector('.button--mobile') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) buttonChoose.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) buttonMobile.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { sendEvent(`Promo ${articles[currentArticleNumber].num} Right`, 'Click') if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?3' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } const sendEvent = (label, action = 'Click') => { const value = `SelectelDIY — loc: Footer — ${label} — ${action}`; if (window.dataLayer !== undefined) { window.dataLayer.push({ event: 'data_event', data_description: value, }); } }; function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите научим?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg?3`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
13 комментариев
Популярные
По порядку
Написать комментарий...
Параллельный жар

Комментарий удален по просьбе пользователя

8

«Ты пид*ор»? Ну блин

10
Параллельный жар

Комментарий удален по просьбе пользователя

2

great minds think alike

2

Гостевые недели Лепры на виси)

2

А как же... просвет чёрной плашки через контрастность?

0

Если вы про замазывание данных через встроенный редактор iPhone — там есть хитрость. Стандартно прозрачность всех инструментов меньше 100%, поэтому можно покопаться в фотошопе и отрегулировать параметры так, чтобы прочитать замазанное. 

7

Так на маркере даже написано 97 сразу же…

Ну и да, это только к маркеру относится, там еще кисть есть

0

Плохие сканы пиратских книг станут лучше?

2

Потому что не замазывать надо, а вырезать

0

Кто вообще так замазывает? Обычно просто одним цветом закрашивают 

0

В первую очередь надо облегчить выделение нужного участка текста, чтобы лишнее не замазать и было ровно. А замазывать большинство готово любым паттерном. То, что тут выдаётся за достижение - изврат и не более

0

Я маркером на мониторе замазываю, ничего не видно и никакая программа не распознает это

0
Читать все 13 комментариев
Продавец eBay из Кургана стала победителем в финале Всероссийского конкурса «Молодой предприниматель России 2021»

27 ноября в Москве состоялся финал ежегодного конкурса «Молодой предприниматель России 2021». В нём приняли участие предприниматели и самозанятые в возрасте до 35 лет. Всего было подано более 300 заявок из 43 регионов страны.

Откуда берут взрослые деревья для парков и улиц

А также сколько они стоят и почему выращивать их — неплохой бизнес.

«Смысл “Тура” — чтобы бренды на футболке получили больше времени на экране»: как устроена экономика гонки «Тур де Франс» Статьи редакции

Соревнование стало гонкой не только велосипедистов, но и брендов — они платят огромные суммы, чтобы их заметила миллиардная аудитория.

«Тур де Франс» в 2021-м Bicycling
Яндекс Еда по подписке завышает цену доставки

Доброе утро

С такой красотой я живу один в деревне. Настоящая русская зима
Доколе? Уже 3 года ссылки с VC.RU на Facebook никуда не ведут

Если привязать аккаунт Facebook к VC.RU, то в профиле появляется ссылка на эту соцсеть, но она никуда не ведёт. Разработчики VC.RU уже 3 года не могут поправить этот баг, зато выпустили корпоративную звонилку.

Нарушение всех сроков и игнорирование ЗоЗПП со стороны М.Видео

Нарушение сроков ремонта и возврата средств

SkillFactory раздает подарки: повышенная ставка и новогодний марафон для вебмастеров

В преддверии Нового года мы решили порадовать своих настоящих и будущих партнеров — участников партнерской программы школ Skillfactory, Contented и Product LIVE. Это возможность получить денежный бонус и заодно увеличить прибыль от продажи наших курсов.

Agricultural technology & Food Innovation
Доказал, что миллиардеры не видят разницы между вином за $500 и $10 тысяч: история Руди Курниавана Статьи редакции

Курниаван продавал подделки под видом редких вин предпринимателям, генеральным директорам и голливудским продюсерам и обманул их более чем на $35 млн.

Руди Курниаван LA Times
Дайджест новостей Сбера: сайт Digital Пётр, сценарии для умного дома и платина от Forbes

Прошлый дайджест мы целиком посвятили 180-летию Сбера, поэтому новостей накопилось много. Среди них — запуск сайта по распознаванию рукописей Петра I, большое обновление на платформе умного дома Sber и другие. Рассказываем всё самое интересное.

Картинка, сгенерированная ruDALL-E по запросу «рыжий котик»
null