История кодового замка. Как я разработал задание на схемотехнику для стенда «Хакера» на ZeroNights

12 и 13 ноября в Санкт-Петербурге проходила ежегодная международная конференция по практической информационной безопасности ZeroNights 2019. Журнал «Хакер» участвовал в мероприятии в качестве информационного партнера, а на нашем стенде, помимо стикеров и скидочных купонов на подписку, можно было найти занятную вещь — электронный кодовый замок. Раскрыть его предлагалось при помощи мультиметра, познаний в электротехнике или просто смекалки.

В августе этого года я уже успел побывать на Chaos Constructions (он, кстати, тоже проводится в Питере) и обратил внимание на то, какой популярностью пользуется спортивный локпикинг — взлом замков с помощью отмычек и подручных средств.

Стенд «Хакера» на ZeroNights
Стенд «Хакера» на ZeroNights
Донские казаки взламывают кодовый замок
Донские казаки взламывают кодовый замок

Меня это, как ни странно, оставило равнодушным, но идея была интересная, и я решил попробовать ее творчески переосмыслить. Хотя и тут я не был первопроходцем: если кто-то читал учебник Харриса и Харрис «Цифровая схемотехника», то там одна из задач была на реверс схемы цифрового замка. Требовалось восстановить по схеме работу конечного автомата и диаграмму его внутренних состояний и узнать код доступа.

Что получилось в итоге
Что получилось в итоге

Однако в таком виде схема не годилась для реализации «в железе»: во-первых, авторы исходили из того, что используются «идеальные» кнопки без дребезга контактов; во-вторых, тактирование для схемы было чисто внешним. Таким образом, нажатие на кнопку и тактовый сигнал были асинхронными по отношению друг к другу, и пользователю, если бы он попытался ввести код, потребовалось бы подгадывать свои действия под обновление состояния в системе.

Разумеется, подобное взаимодействие для реального устройства сложно назвать естественным и интуитивным, поэтому схема нуждалась в доработке. Но само направление мне показалось верным, и я решил двигаться дальше. Первые наивные попытки накидать схему на скорую руку выявили основную проблему: внешним источником тактирования мог быть только пользовательский ввод (нажатие на кнопку). Но оно же было и информационным сигналом в схеме! Таким образом, попытка захватить в какой-нибудь триггер состояние входного сигнала (по фронту или спаду) неизбежно порождала неопределенность.

INFO

Тут следует сделать небольшое отступление и заранее предупредить, что я не профессиональный разработчик цифровых схем. Основы цифровой схемотехники я знаю ровно настолько, чтобы понимать, из чего состоят и как работают простейшие компьютерные блоки: регистры, АЛУ, память и прочее. Ничего сверхсложного я никогда не реализовывал, и, как должен работать подобный цифровой замок, я тогда понимал для себя только приблизительно, в теории. Поэтому моя схема может быть неоптимальной и даже излишне запутанной.

Тогда я решил подробнее ознакомиться с вопросом и полез в интернет искать похожие примеры. Первые же ссылки в Яндексе помогли прояснить несколько вещей: во-первых, такие схемы есть; во-вторых, почти все они мне не понравились. Сейчас попробую объяснить почему. Я не буду здесь приводить ссылки на конкретные работы, чтобы не обижать авторов. При желании все можно легко найти самостоятельно.

Так вот, как выяснилось, часть схем не предполагала сброса при неверной комбинации — это облегчало подбор. Другая часть не позволяла использовать одну и ту же цифру больше одного раза в пароле — это сокращало пространство вариантов (при десяти цифрах и четырехзначном числе получается 5040 комбинаций вместо 10 000!). Наконец, авторы некоторых примеров мешали в одну кучу цифровую и аналоговую схемотехнику, что мне вообще не понравилось.

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

Я решил остановиться на 561-й серии микросхем, просто потому, что небольшое их количество у меня оставалось с предыдущих проектов. Кроме того, у них широкий диапазон входных напряжений — можно использовать хоть батарейки АА, хоть «Крону». К тому же «Интеграл» выпускает их массово, их легко достать и большинство все еще доступно в DIP-корпусах. Это облегчает реверс схемы — все-таки проект делается преимущественно для развлечения.

Ну и на самом деле — мне вообще нравятся старые корпуса для микросхем. В них чувствуется какая-то монументальность, классицизм, что ли. Широкие DIP-40 для микропроцессоров и микроконтроллеров, PLCC-44 для параллельной памяти и PLCC-84 для микросхем CPLD. Я решил, что стилистика ретро проекту не повредит, тем более что DIP в цанговых панельках (а я собирался использовать именно такие в конечном варианте) выглядят просто потрясно, тут вряд ли у кого будут возражения.

Первым делом нужно было решить проблему с дребезгом. На страничке «Википедии» приведена схема подавления дребезга кнопки с перекидным контактом на двух вентилях 2И-НЕ. Этому соответствует микросхема К561ЛА7, и первоначально я использовал ее. У нее четыре логических вентиля, и это означало, что на каждый корпус я смогу завести сигнал с двух кнопок. Не сказать, конечно, что это много…

Мне нужно было десять кнопок для десяти цифр плюс кнопка сброса. Одиннадцать в аккуратную матрицу не раскладывались (сюрприз!), поэтому я решил увеличить их количество до двенадцати. А это уже целых шесть микросхем. Как-то расточительно. Тогда я пролистал список микросхем «Интеграла» еще раз и обнаружил подходящую деталь — К561ТР2. Это четыре RS-триггера в одном корпусе, а они как раз собираются из пары вентилей И-НЕ. Ура, беру их!

Следующий шаг — собрать счетчик. Схему нужно принудительно сбрасывать, если пользователь не ввел правильный код за разрешенное число попыток, а это значит, что придется считать нажатия. Для этого требуется логический элемент 10ИЛИ, но в готовой микросхеме их не существует. Тогда я использовал обе половинки ИС К561ЛЕ6 (4ИЛИ-НЕ), дополнительно вентиль от ИС К561ЛЕ5 (2ИЛИ-НЕ) и объединил их с помощью ИС К561ЛА9 (3И-НЕ).

Если вспомнить правила де Моргана, то инвертор с выхода элемента ЛА9 можно переместить на его входы, при этом И поменяется на ИЛИ, а сами инверторы взаимно аннигилируют с НЕ на выходах ИЛИ-НЕ. Получается 10ИЛИ — как раз то, что нужно. Кроме того, я дополнительно инвертировал выходной сигнал, чтобы получить сброс по отжатию кнопки — когда пользователь завершил ввод.

Сам по себе счетчик стандартный и состоит из трех D-триггеров на микросхемах К561ТМ2. Биты его состояния будут служить для индикации прогресса и для принудительного сброса (нижняя часть второго листа схемы). Здесь же впервые появляется сигнал от общего сброса, в котором участвует и сигнал от кнопки сброса.

Наконец, центральная часть устройства, которая, собственно, и служит для хранения правильной последовательности. Я специально не стал здесь вводить дополнительное шифрование состояний конечного автомата. Да, это позволило бы сократить количество используемых D-триггеров, но отрицательно сказалось бы на легкости восприятия схемы. Напомню, основное назначение — это не чтобы «никто не решил», а чтобы большинство посетителей смогло поучаствовать и получить свою порцию удовольствия. Все же основные специализации у посетителей ZN — это веб, мобильные приложения и прочие далекие от железа вещи.

Итак, для кода используется пять значащих цифр и пять D-триггеров. Изначально я планировал всего четыре цифры и десять тысяч комбинаций, но от схемы счетчика остался один «лишний» бит, поэтому я решил добавить его сюда, в последовательность пароля. По сути, это «плюс 90 тысяч комбинаций за те же деньги!». Хороший маркетинговый ход, наверное. 🙂

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

Этот выход, в свою очередь, соединен с микросхемой-таймером КР1006ВИ1 (аналог популярной ИС NE555). Она настроена с помощью RC-цепочки на частоту в 10 Гц и отвечает за простенькую анимацию на светодиодах типа «бегущий огонек» (вторично используются светодиоды на шкале прогресса). Я не буду подробно останавливаться на схеме анимации, смысловой нагрузки для основных задач проекта она не несет, разве что дополнительно привлекает внимание, пока работает.

Скажу лишь, что здесь используется еще один счетчик — микросхема К561ИЕ8 (десятичный счетчик-делитель) — биты CLK0–CLK2 и элементы исключающего ИЛИ (К561ЛП2) для управления светодиодами D6–D15. Все вместе они образуют своего рода дешифратор, который позволяет использовать единственную шкалу как для индикации прогресса, так и для анимации (два режима работы).

С микросхемой-таймером ВИ1 связана одна любопытная деталь. Формально она не относится к 561-й серии, и ее рабочий диапазон напряжений начинается от 5 В (против трех у всех остальных микросхем на плате). Экспериментальным путем было выяснено, что таймер запускается и от 3,5 В, хотя за точность и характеристики выходного сигнала в таком режиме я не ручаюсь (не измерял).

На самом деле в качестве генератора тактового сигнала для анимации можно было вместе с RC-цепочкой использовать и триггер Шмидта из 561-й серии — К561ТЛ1. Но я узнал об этом уже слишком поздно, когда плата была почти готова. Если кому интересно, рекомендую почитать книгу «Проекты и эксперименты с КМОП микросхемами». В ней на примере микросхемы К561ТЛ1 демонстрируются самые разные способы применения. Итоговое устройство могло бы быть собрано на микросхемах одной серии. Обязательно учту на будущее.

Чтобы убедиться в работоспособности схемы, я предварительно собрал все на беспаечной макетке. Параллельно разводкой платы занялся мой хороший знакомый — @sadko. И тут нужно сказать, что, несмотря на мою корявую принципиальную схему и невнятное (на словах) ТЗ и описание, он справился с задачей в рекордные сроки — буквально за пару дней. Более того, плата у него оказалась даже гораздо меньше, чем я изначально предполагал.

Казалось бы, это плюс, но мне теперь предстояло размещать на производстве сверхсрочный заказ (с соответствующим коэффициентом). Китай отпадал сразу же, связываться даже с курьерской службой не хотелось. Зеленоградский «Резонит» тоже не подходил, там минимальный срок составлял около недели. К счастью, в том же Зеленограде нашлась фирма «ТеПро», она бралась изготовить несколько экземпляров этой двуслойки с шелкографией и металлизацией всего за 36 часов!

Кстати, со сроками в «ТеПро» погорячились, и все равно потребовалось 48 часов от подтверждения оплаты до момента, когда я получил в их офисе заветные куски текстолита. Но я был рад и такому результату! Хотя от итоговой цены до сих пор немного в дрожь бросает, хорошо хоть не из своего кармана. 🙂

Дальше — поиск и покупка комплектующих (в основном брал в «Чипе и Дипе», но часть пришлось искать и на Митинском радиорынке). Не обошлось без огорчений: изначально я предполагал использовать суровые «советские» светодиоды АЛ102 с металлическим цоколем (для антуражу, и вообще, это же ретро!). Знакомый меня отговаривал, мотивируя тем, что они слабо светят. Действительно, характеристики на страничке товара не впечатляли: всего 0,15 мКд против стандартных 30–40 мКд у других светодиодов того же цвета и размера.

Но я все-таки решился попробовать и заказал несколько штук. Увы, меня ждало разочарование: не знаю, где в «Чипе и Дипе» хранили эти компоненты, но у 80% из купленных мной светодиодов не только необратимо помутнела линза, но и образовался какой-то желтый налет. В общем, если им и предстояло когда-то светить, то явно уже не в этой жизни.

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

Напоследок пару слов о том, какие подсказки были доступны участникам. Во-первых, выход с каждого D-триггера для пароля дополнительно уходил на светодиоды группы D1–D5. В теории это сводило задачку к простому перебору, и некоторые при отсутствии других идей или желания возиться прибегали к нему. Это не баг, это фича! Во-вторых, кнопка с первой цифрой пароля дополнительно маркировалась на шелкографии небольшим логотипом журнала. Его, вопреки моим ожиданиям, заметили только единицы.

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

Читать новость в источнике Xakep

0