Krupnikas / Octave
Labels
Projects that are alternatives of or similar to Octave
Octave - Музыкальная передача данных
Это проект, на который меня вдохновила уязвимость в «Яндекс.Станции».
Я написал про него на Хабре:
Реверс инжиниринг протокола активации Яндекс.Станции
Как уязвимость в Яндекс.Станции вдохновила меня на проект: Музыкальная передача данных
И на vc.ru:
Уязвимость в «Яндекс.Станции» вдохновила меня сделать сервис для музыкальной передачи данных
В репозитории можно найти файлы на Python в папке research и продолжить эксперименты. Также тут хранятся фалы для web-демки доступной по адресу octave.skrup.ru - при желании можно выбрать другие ноты для передачи данных и, так сказать, поменять жанр. Затем развернуть на своем сервере.
Кратко перескажу статьи здесь.
С чего все началось?
Друзья подарили мне «Яндекс.Станцию». Для её активации нужно было поднести телефон и проиграть звук из приложения «Яндекс».
Я создал точку доступа Wi-Fi с паролем «012345678» и записал получившийся сигнал. Затем посмотрел на спектрограмму и понял, как устроен сигнал и где лежит пароль от WiFi.
Данные для Станции кодируются символами по 4 бита. По сути кодируется hex строка, где каждому значению 0 — F соответствует своя частота от 1 кГц до 4,6 кГц с шагом в 240 Гц. Пароль не шифруется и передаётся в открытом виде.
Я размышлял, зачем нужно было делать активацию так, а не через Bluetooth, как, например, у китайских пылесосов-роботов, и пришёл к выводу, что в этом случае эффектность важна больше, чем безопасность или скорость.
Действительно! Ведь протокол связи — всегда компромисс между дальностью, скоростью и надёжностью. А что, если все эти характеристики отойдут на второй план, а определяющим станет фактор впечатления для пользователя? Я решил сделать протокол, в котором для модуляции будут использоваться частоты нот.
Как сделал
Мне понравилась простая, как молоток, идея разработчиков «Яндекса» — выбрать 16 частот: по одной для каждого hex-символа. А ещё у меня остались наработки от реверс-инжиниринга, поэтому я решил развить эту идею, а не придумывать всё с нуля.
Глубоко в технику вдаваться не будем: подробнее о разработке я написал в другой статье на «Хабре». А сейчас расскажу в двух словах.
Я избавился от щелчков в сигнале «Яндекс.Станции» и выбрал новые частоты для передачи: 16 нот, начиная с До первой октавы. Вот так:
Если использовать более высокие ноты, то становится менее комфортно ушам. А более низкие ноты хуже передаются из-за особенностей динамиков и микрофонов.
Получилась своего рода музыкально-частотная модуляция. Назовём её «круп-модуляция» :)
Как звучит?
Чтобы можно было попробовать прямо в браузере, я переписал передатчик с круп-модуляцией с Python на JavaScript и сделал простенький интерфейс.
Пользуясь случаем, хочу передать привет:
Кириллические символы и даже эмодзи тоже работают. Но посылки с ними получаются длиннее и менее мелодичными из-за особенностей кодировки.
Можете попробовать любые фразы тут
Как принимается?
Это, конечно, весело — слушать рандомные звуки на основе текста, но передачей данных можно будет назвать, только если сигнал будет приниматься.
Я сделал прототип приёмника в качестве proof of concept. Вот как он работает:
Видите, передача данных идёт как по нотам! Конечно, ни о каком продакшне сейчас речи не идёт. Тут нет синхронизации, помехоустойчивого кодирования и контроля целостности. Вы можете доработать сами - все исходники тут.
Как думаете, какие варианты практического применения и коммерциализации могут быть у музыкальной передачи данных?
Подводя итог
Это был интересный проект на пару вечеров с достаточно эффектным результатом. Такую передачу данных можно использовать, например, как «звуковой QR-code» — расшарить аккаунт с телефона на сайт и прочее.