Как уязвимость в Яндекс.Станции вдохновила меня на проект: Музыкальная передача данных

    На прошлой неделе я рассказал, как устроена активация Яндекс.Станции через звук. Оказалось, что пароль от WiFi передаётся в открытом виде. Я размышлял, зачем вообще нужно было делать активацию так, а не каким-то отлаженным способом.

    В итоге, пришел к выводу, что в этом процессе важно шоу. Но, что будет, если сделать протокол передачи данных, полностью ориентированный на впечатление пользователя? Так родился проект «Octave» — для мелодичной передачи данных.



    Под катом я расскажу, как сделан прототип, и дам ссылку на демку. Вы сможете сами послушать, как звучит любое сообщение :)

    Краткое содержание предыдущей статьи


    Я записал звук, которым активируется Станция, посмотрел на визуализацию скользящего преобразования Фурье и понял, как устроен сигнал и где лежит пароль от WiFi в открытом виде.



    Передаётся hex-строка, где для каждого символа 0 — F есть своя частота 1 кГц — 4,6 кГц с шагом в 240 Гц. Я размышлял, зачем нужно было делать активацию так, а не через Bluetooth, как например у китайских пылесосов-роботов, и пришел к выводу, что в данном случае эффектность важна больше, чем безопасность или скорость.

    Вдохновение


    Действительно! Ведь протокол связи — всегда компромисс между дальностью, скоростью и надежностью. А что если все эти характеристики отойдут на второй план, а определяющим станет фактор впечатления для пользователя?

    Мне понравилась простая, как молоток, идея разработчиков Яндекса — выбрать 16 частот: по одной для каждого hex-символа. А еще у меня был приёмник сигнала с прошлого исследования, поэтому я решил развить эту идею, а не придумывать все с нуля.

    Два улучшения


    Убираем разрыв фазы


    Во-первых, когда я анализировал сигнал активации Станции, меня смутил шум на всех частотах в момент переключения символа. Это вертикальные полосы на спектрограмме:



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



    В радио есть разные методы, позволяющие избежать этого эффекта. Я же решил плавно уменьшать амплитуду сигнала к моменту переключения частоты, а затем плавно наращивать — это звучит более мягко. Выглядит это так:



    Возможно, щелчки были не багом, а фичей и давали более «футуристичный» звук, но мне больше нравится без них :)

    Добавляем музыку


    Мы передаём данные через звук. Почему бы не использовать для этого частоты нот? Я попробовал разные варианты, в итоге выбрал 16 нот, начиная с До первой октавы.



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

    Получилась своего рода музыкально-частотная модуляция. Назовём её «Круп-модуляция» :)

    Запускаем


    Как же это звучит? Чтобы можно было попробовать прямо в браузере, я переписал передатчик с Круп-модуляцией с питона на js и сделал простенький интерфейс.

    Пользуясь случаем, хочу передать привет:


    Я использую utf-8, а значит кириллические символы и даже эмодзи тоже можно передавать. Посылки с ними получаются длиннее, так как на каждый такой символ приходится больше 1 байта.


    Звучит чуть менее приятно, чем латиница, так как каждый кириллический символ содержит один и тот же байт адресации. Но все равно интересно :)

    Можете попробовать любые фразы тут. (Продублирую в конце статьи)

    А как же приёмник?


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

    Я сделал прототип приёмника на питоне в качестве proof of concept. Вот, как он работает:


    Видите, передача данных идет, как по нотам! Конечно, ни о каком продакшене сейчас речи не идёт. Тут нет синхронизации, помехоустойчивого кодирования и контроля целостности. Но если сообщество проявит интерес и подкинет пару вариантов практического применения, я могу реализовать перечисленный функционал и обернуть в нормальную библиотеку :)

    Велосипедист?
    Я знаю, что передача данных через звук хорошо проработана. Есть библиотеки, работающие в том числе с ультразвуком, DTMF до сих пор распространен, а тоновые команды люди даже эмулировали свистом. Но проектов, использующих ноты для передачи данных я не встречал. Напишите, пожалуйста, в комментариях, если знаете что-то подобное.

    Подводя итог


    Это был интересный проект на пару вечеров с достаточно эффектным результатом. Такую передачу данных можно использовать, например, как «звуковой QR-code» — расшарить аккаунт с телефона на сайт и т.п.

    Как вариант, с её помощью можно создавать мелодии для брендов. Вот, например, как звучит habr.

    Все текущие наработки доступны на гитхабе — вы можете сами попробовать развить проект.

    Дублирую ссылку на демку, работающую в браузере.

    Спасибо, что дочитали! Надеюсь, вам было интересно.

    Успехов!
    Поддержать автора
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 44

      +1

      Идея передачи настроек сети была у Amazon Dash. Возможно в Яндексе вдохновлялись с неё. И передача звуком была сделана для простоты и надёжности. Потому что динамик точно есть на любом, даже самом ужасном смартфоне и его точно хватит. А блютус, даже если не глючит, ещё надо спарить и настроить.

        0
        А блютус, даже если не глючит, ещё надо спарить и настроить.

        NFC вроде и придумывали чтоб решить эту проблему

          0

          Но он есть не везде.

            0

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

        +3
        стоит объявить конкурс на самую приятно звучащую фразу)
          +6
          Пжалста!
          Ввод цитаты из поста заставил скрипт задуматься, а потом выдать недурственный трек.
          Попробуйте сами
          Я использую utf-8, а значит кириллические символы и даже эмодзи тоже можно передавать. Посылки с ними получаются длиннее, так как на каждый такой символ приходится больше 1 байта.
            +1
            У меня получилось что-то похожее на главную тему из Пиратов Карибского моря.
            Строка такая: !"3DUD3"3DUDD3DUD3"3"!" !
            Послушать
              +6
              Еще что получилось — В лесу родилась елочка (В начале — пробел):
              ffUfD ffwUX (!wwfUD ffUfD
              Послушать
              +3
              Не знаю почему, но мне очень понравилось.
                0

                Спасибо! Очень приятно)

                +1
                Надо теперь пропустить стихотворения через данный способ передачи данных. И наоборот, попытаться найти такой набор символов, который будет «передаваться» какой-то знаменитой мелодией =)
                  0

                  Интересная у вас идея!

                    0

                    Подобрал пару мелодий. В ответе на комментарий выше

                    0
                    Я размышлял, зачем вообще нужно было делать активацию так, а не каким-то отлаженным способом.

                    А какие существуют отлаженные способы передачи данных на не подключенные к сети устройства без дисплея и клавиатуры?
                      +3
                      Все не перечислю, но например, пылесос-робот у меня раздал WiFi, я подключился к нему и ввел пароль от домашней сети в веб-интерфейсе. А умная лампа получила данные для подключения через Bluetooth.
                        0
                        По степени надёжности:
                        nfc, qr-code, bluetooth, pin устройства, подключение к wifi устройства для настройки…

                        +3

                        Передавать можно только по одной ноте за раз? Целым аккордом нельзя, случайно? Подучился бы очень мелодичный «модулятор» ;)

                          +1
                          Интересная идея! Тоже думал про комбинации нот и аккорды, как возможное направление развития :)
                            0

                            Приятно звучат не любые интервалы, а консонансы, из "сигнального созвездия" много точек "выкладывается"

                              +1
                              Аккордом из 8 нот можно будет передать 1 байт.
                              А ещё можно попробовать сделать более мелодично, расставив значения по, например, терциям:

                              image

                              Попробуйте?
                              0
                              Плюсую вопросу
                              0
                              Я недавно написал статью про применения: habr.com/ru/post/468951 Конечно, там у меня другой тип кодирования, не столь мелодично. Но практично. Декодирование происходит на PIC16 8MIPS, сейчас переписываю на ASM для целевого 2 MIPS контроллера. Декодер без умножения и деления. К сожалению, из за нехватки времени пока не дописал продолжение статьи. Макет — 4.1 байта / сек, Сигнал / шум 1:1. Широтно-импульсное кодирование, FM модуляция. WEB демка тоже готова. Так же «передатчик» переписывал с python на js, хоть ни то ни другое не знаю…
                                +19
                                Миллениалы изобрели модем
                                en.wikipedia.org/wiki/Modem
                                  +1

                                  зашел в камменты, чтобы найти именно этот

                                  +3
                                  R2D2 в тренде :)
                                    0
                                      +2
                                      Напомнило загрузку игр с ленты в Спектрум.
                                        0
                                        Ну и еще приемникам таких передач стоит всегда воспринимать такой ввод как недоверенный. А то услышит он в один прекрасный день такое приятное и мелодичное "'; DROP T ABLE users; --".

                                        P.S. [paranoid] Воткнул пробел посреди ключевого слова… мало ли. [/paranoid]
                                          +1

                                          Напомнило тональный наборы телефоне. И да, там частотная модуляция.

                                            +2
                                            Можно попробовать цифры расположить по блюзовому ладу, а не только по белым клавишам. Думаю очень круто звучать будет :)
                                              –1
                                              Пока эти станции по своему спектору особо и не нужны
                                                0

                                                Идея не нова. Сюжет старого фильмы про супер героя HiMen'а. Там был звуковой ключ от очень важного портала, и тот ключ враг героя злодейски уничтожил… но героя выручил школьник с синтезатором. Сумел подобрать правильные аккорды ;)

                                                  0
                                                  sample
                                                  тут можно пойти в сторону программирования музыки на естественном языке и вспомнить проект sonic-pi
                                                    0

                                                    Подбирать музыку для брендов на основе этого было бы классно. Только вот если вдруг станция услышит закодированную таким способом команду купить кукольный домик с доставкой, будет не очень :D


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


                                                    Интересно, если включить какую-нибудь музыку, приемник распознает какие-нибудь символы?
                                                    С телефона, кстати, "щёлкает" звук, не получилось до конца избавиться от эффекта

                                                      0
                                                      Передача данных звуком? Все уже было придумано до нас )
                                                      youtu.be/6AI-E8R3qTs
                                                        0
                                                        www.google.com/doodles/celebrating-johann-sebastian-bach

                                                        По ссылке дудл от гугла к дню рождения баха.
                                                        мелодия дополнялась еще басами и альтом
                                                          +1
                                                          Передача данных звуком? Все уже было придумано до нас )


                                                          А чего никто азбуку морзе не вспомнил? Вполне мелодично…
                                                            0

                                                            У меня уже давно есть идея по созданию приложения, которое могло бы транслировать звук (тот самый, который выводится на динамики) с одного компьютера на другие в сети. И нужно решить проблему с синхронизацией и устранением задержки. Скорее всего, решу эту проблему через звуковые сигналы, так как задержка звука меньше, чем сети (наверное). Но я вспомнил одно приложение, у honor есть аналог. Оно позволяет сонхронизировать воспроизведение музыки на нескольких устройствах. Работает это через nfc, через него передаются данные WiFi сети, а дальше классика: сервер, поток аудио. Так вот, если на устройстве нет nfc, то приложением пользоваться нельзя. Но можно же передавать информацию, например, звуком, раз уж такая технология есть.


                                                            Возможно, можно передавать информацию таким образом на фоне музыки… Будет звучать ещё лучше

                                                              0
                                                              vldF, имеет смысл имхо только для мощной акустики.
                                                              микрофоном контролировать синхронность прихода звуковых волн
                                                              с разных колонок в точке, где требуется лучшее звучание.
                                                              А если Вы расставляете колонки в ряд, то
                                                              К1 — М1 — К2 — М2 — К3
                                                              то будет еще неопределенная задержка между съемом показаний M1 и M2

                                                                0
                                                                Звукорежиссёры в залах с распределённой акустикой обычно банальной рулеткой измеряют расстояние до вторых порталов и считают задержку.
                                                              +1
                                                              Кириллица как раз лучше звучит чем латиница, ибо из-за повторяющегося тона больше похоже на музыку. :) Введите короткое предложение и наслаждайтесь музыкой. :) Можно таким образом в музыкальные произведения закладывать смысл.
                                                              Впрочем у именитых известных фирм, данный метод используется для защиты авторских прав на контент. Включаешь фильм или музыку, оно проигрывается несколько минут, а потом звук пропадает с характерной надписью на экране. :D
                                                                0

                                                                Google tone — расширение для Chrome передаёт url звуком

                                                                  0
                                                                  А можно как нить скачать?
                                                                  Хочу мелодию на звонок поставить =)
                                                                    0
                                                                    R2D2, ты ли это?
                                                                    Как вариант, можно использовать такой вид передачи под водой.

                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                    Самое читаемое