Decimen Optical Transfer: как передать файл без Bluetooth и интернета

1712
Decimen Optical Transfer: как передать файл без Bluetooth и интернета

Decimen Optical Transfer представляет собой браузерный инструмент для передачи файлов и текста через оптический канал. Одно устройство показывает быстро меняющиеся QR-коды, другое считывает поток камерой и восстанавливает исходные данные. Wi-Fi, Bluetooth, кабель, учётная запись или прямое сетевое соединение между устройствами не требуются.

Что такое Decimen Optical Transfer

Decimen превращает экран одного устройства в передатчик, а камеру другого – в приёмник. Пользователь выбирает файл или вставляет текст, браузер разбивает содержимое на блоки и кодирует последовательность QR-кадров. Получатель считывает достаточное количество кадров, восстанавливает исходные данные и предлагает сохранить файл.

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

Актуальная версия поддерживает произвольные файлы размером до 64 МБ и текстовые фрагменты до 16 КБ. Имя файла и MIME-тип сохраняются. Перед передачей приложение может применить gzip, но только если сжатие действительно уменьшает объём данных.

Функции Decimen

  • передаёт произвольные файлы размером до 64 МБ;
  • передаёт текст объёмом до 16 КБ;
  • работает без сетевого соединения между отправителем и получателем;
  • адаптивно сжимает данные через gzip;
  • проверяет восстановленное содержимое по SHA-256;
  • передаёт через один, два, четыре или шесть QR-кодов одновременно;
  • настраивает частоту показа кадров и плотность данных;
  • позволяет выбрать камеру на принимающем устройстве;
  • параллельно декодирует через Web Workers;
  • экспортирует QR-поток в APNG или последовательность PNG;
  • предлагает диагностический и контрольный режимы для измерения скорости;
  • работает офлайн в формате PWA;
  • поддерживает автономные HTML-файлы для отправителя и получателя;
  • переведён на 12 языков, включая русский.

QR-коды принимает отдельный WebAssembly-декодер decimen-codec, основанный на zxing-cpp. Проект старается разгрузить основной поток браузера и распределяет распознавание кадров между рабочими потоками.

Как работает передача

Как передавать файлы через Decimen

Главная проблема канала «экран → камера» связана с отсутствием обратной связи. Получатель не может попросить отправителя повторить конкретный потерянный фрагмент. Камера при этом регулярно пропускает кадры из-за движения, автофокуса, бликов, частоты обновления экрана и ограничений самого браузера.

В актуальном исходном коде Decimen использует схему, которую разработчик называет systematic carousel. Исходный файл разбивается на K блоков. Сначала передатчик последовательно показывает все K исходных блоков, затем отправляет ещё K восстановительных кадров. Каждый такой кадр содержит XOR-комбинацию псевдослучайно выбранных исходных блоков. Для восстановительных кадров текущая реализация выбирает от 4 до 24 блоков.

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

В документации проекта есть заметное расхождение. Файл docs/technical/protocol.md по-прежнему описывает классический LT fountain coding с robust-soliton distribution и утверждает, что каждый передаваемый кадр представляет собой псевдослучайную XOR-комбинацию блоков. Однако актуальный shared/fountain.ts прямо указывает, что такой алгоритм относится к старому wire format v1, сохранён в кодовой базе для тестовых векторов и больше не используется отправителем. Систематическая карусель появилась в v0.4.0 и сохранилась после перехода на wire format в версии 0.5.0.

Версия 0.5.0 также увеличила заголовок кадра с 20 до 22 байт. В заголовке появились отдельные поля magic, версия протокола и флаги функций. Кроме них передаются идентификатор сеанса, номер кадра, количество блоков, размер блока, полный размер данных и контрольное значение полезной нагрузки. Благодаря версии формата современный приёмник может определить, что передатчик использует несовместимую старую или новую версию протокола.

Проверка целостности

Внутри передаваемого контейнера Decimen хранит имя файла, MIME-тип, информацию о сжатии и SHA-256 исходных байтов. После восстановления содержимого приложение пересчитывает SHA-256 и проверяет результат перед сохранением.

SHA-256 в данном случае служит проверкой целостности, но не аутентификацией. Decimen не устанавливает доверительные отношения между устройствами и не подтверждает личность отправителя. Отдельное поле payloadFnv в заголовке использует FNV-1a, который также не является криптографическим механизмом защиты.

Скорость передачи

Разработчик публикует контрольные прогоны вместе с диагностическими отчётами. В таблице результатов для v0.4.0 указан устойчивый поток 418,5 КБ/с при передаче с настольного компьютера на iPhone 17 Pro Max через четыре QR-кода. Файл размером 1 МиБ в этом тесте передали за 2,5 секунды.

Для передачи между двумя iPhone 17 Pro Max через два QR-кода опубликован результат 199,2 КБ/с и 5,1 секунды на тот же файл размером 1 МиБ. README также содержит иллюстрацию передачи примерно на 130 КБ/с, но эта цифра относится к отдельному демонстрационному прогону, а не к текущему рекорду.

Результаты нельзя считать гарантированной скоростью. Пропускная способность зависит от камеры, дисплея, расстояния, освещения, автофокуса, количества одновременно показываемых QR-кодов и производительности устройства.

Безопасность и ограничения

Отсутствие сети не означает конфиденциальность. Decimen не шифрует QR-поток. Любая камера, которая достаточно хорошо видит экран отправителя, потенциально может записать кадры и восстановить содержимое. Для секретных файлов данные нужно зашифровать отдельно до запуска передачи.

В GitHub-репозитории остаётся открытым отчёт о DoS принимающей вкладки. Проблема связана с тем, что обработчик кадра принимает поля k, blockLen и totalLen, но не проверяет их взаимную согласованность.

Специально подготовленный QR-код может указать k=1, небольшой размер блока и totalLen=0xFFFFFFFF. После единственного degree-1 кадра декодер считает блок восстановленным и может попытаться создать Uint8Array размером около 4,29 ГБ. На мобильном устройстве такая операция способна исчерпать доступную вкладке память и привести к её аварийному завершению.

Автор отчёта оценивает проблему как Medium, примерно 4,3 балла CVSS 3.1. Атака затрагивает только доступность. Для эксплуатации пользователь должен направить камеру Decimen на подготовленный QR-код, а последствия ограничиваются принимающей вкладкой браузера. Утечки данных или изменения файлов отчёт не описывает. На момент проверки issue остаётся открытым, а актуальная функция проверки кадра всё ещё не контролирует соответствие totalLen произведению количества и размера блоков.

Практические ограничения оптического канала

Высокая плотность QR-кода подходит не каждой камере. По умолчанию Decimen может помещать до 2953 байт в один кадр. Если обычный монитор считывается плохо, документация рекомендует уменьшить значение до 1465 байт, а при необходимости снизить частоту отправки до 24 кадров в секунду. Также помогают высокая яркость экрана, крупный QR-код и неподвижная камера.

Версия 0.5.x несовместима с 0.4.x на уровне wire format. При использовании сайта достаточно обновить обе страницы. Пользователям автономных HTML-файлов нужно брать sender и receiver из одного поколения релизов.

Для кого подойдёт Decimen

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

Подход может пригодиться при работе с изолированными компьютерами и тестовыми средами. Decimen также интересен как практическая демонстрация однонаправленного оптического канала и методов восстановления данных при потерях кадров.

Для регулярной передачи больших архивов инструмент подходит хуже. Ограничение в 64 МБ, зависимость от камеры и дисплея и небольшая по сравнению с обычной сетью пропускная способность делают Decimen специализированным решением.

Как установить и запустить

Обычному пользователю устанавливать программу не требуется. Готовое веб-приложение доступно на сайте decimen.app. На одном устройстве выбирают режим Send и файл или текст, на другом открывают Receive, разрешают браузеру доступ к камере и направляют её на QR-поток.

После первого посещения PWA кэширует необходимые файлы, включая WASM-декодер, и может работать без сети. На Android приложение можно добавить через функцию установки Chrome, на iOS через «Добавить на экран Домой» в Safari.

Для запуска исходного кода нужен Node.js 24 или новее:

git clone https://github.com/bashalarmistalt/decimen-optical-transfer.git
 cd decimen-optical-transfer
 npm install
 npm run dev

Среди дополнительных команд доступны:

npm run serve
 npm run diagnostics
 npm run benchmark
 npm test
 npm run build
 npm run build:standalone
 npm run build:all

npm run build:standalone создаёт два автономных HTML-файла. Страница отправителя занимает примерно 55 КБ, страница получателя – около 1,3 МБ. Основную часть размера приёмника формирует встроенный WASM-декодер объёмом около 940 КБ.

У автономного приёмника есть ограничение. При запуске через file:// настольные Chrome и Firefox обычно разрешают доступ к камере, тогда как мобильные Chrome и Safari локальному HTML-файлу камеру не предоставляют. Для смартфона удобнее использовать PWA или открыть приёмник через HTTP(S).

Аналоги и форки

Сам разработчик упоминает несколько проектов с похожей идеей. divan/txqr появился ещё в 2018 году и также объединяет анимированные QR-коды с fountain coding. Проект sz3/libcimbar отказывается от обычных QR-кодов в пользу собственного высокоплотного цветного формата. Ещё один проект, airgapped-qr-code-transfer, использует браузерную передачу через последовательные QR-фрагменты.

Отдельно существует поддерживаемый форк tongatron/decimen-optical-transfer. Форк сохранил MIT-лицензию старой кодовой базы и выбрал другие компромиссы. Лимит файла составляет 2 МБ, зато появились оптимизация JPEG, PNG и WebP перед передачей, вставка изображений из буфера обмена, командная строка и интеграции с файловыми менеджерами Windows, macOS и Linux. Форк развивается независимо и не является текущей версией основного Decimen.

Плюсы и минусы

Плюсы Минусы
Между устройствами не требуется сетевой канал QR-поток не шифруется
Не нужны аккаунты и сопряжение устройств Файлы ограничены размером 64 МБ
Восстановительные кадры компенсируют потерю части QR-кодов Скорость сильно зависит от камеры и дисплея
Можно использовать через браузер, PWA или автономные HTML-файлы Мобильные браузеры ограничивают доступ к камере для receiver через file://
Есть проверка SHA-256 восстановленных данных Нет встроенной аутентификации отправителя
Поддерживает несколько QR-кодов одновременно Wire format 0.5.x несовместим с 0.4.x
Можно экспортировать поток в APNG или PNG-последовательность Открыт отчёт о DoS через специально сформированный кадр
Есть диагностика и воспроизводимые контрольные прогоны Технический protocol.md сейчас расходится с актуальной реализацией fountain-кода

Лицензия

Текущий Decimen Optical Transfer распространяется по лицензии AGPL-3.0-or-later. Переход состоялся в версии 0.4.0. Релизы до v0.3.0 включительно были опубликованы по MIT и сохраняют прежние условия.

Разница имеет практическое значение для разработчиков. AGPL содержит copyleft-требования, которых нет в MIT. В репозитории также присутствуют компоненты и фрагменты с другими совместимыми лицензиями, а NOTICE фиксирует их происхождение. Организациям, которые планируют встраивать актуальную кодовую базу в собственные продукты, нужно учитывать лицензию конкретной версии, а не ориентироваться на старые MIT-релизы или сторонние форки.

Заключение

Decimen Optical Transfer решает узкую, но понятную задачу. Инструмент переносит файлы через физический канал «экран → камера» и не требует прямой сети между устройствами. Текущий релиз v0.5.3 поддерживает файлы до 64 МБ, передачу несколькими QR-кодами, офлайн-PWA, автономные сборки, экспорт в APNG и PNG и интерфейс на 12 языках.

Систематическая карусель с восстановительными XOR-кадрами позволяет переживать пропуски камеры без обратного канала и повторных запросов. При этом высокая скорость требует подходящего экрана, камеры и корректно подобранной плотности QR-кодов.

Главные ограничения связаны с самой моделью передачи. Decimen не шифрует поток, уступает сети и кабелю на больших объёмах данных и зависит от физических условий съёмки. Кроме того, в текущей версии остаётся открытым отчёт о DoS принимающей вкладки, а один из технических документов проекта пока описывает старую версию fountain-кода.

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

Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
серая зона: медицина / допинг
Эффект есть.
Вопрос — чем за него платить
Открыть разбор
в разборе:
  • кофеин
  • модафинил
  • метилфенидат
  • фенилпирацетам
  • креатин
  • мелатонин
Реклама

Комнатный Блогер

Объясняю новую цифровую реальность