Skype на протяжении десятка лет является одним из популярнейших VOIP приложений. Главные его преимущества — значительная распространенность среди пользователей и легкость поиска нужного контакта. Недостатки (с точки зрения транспортной безопасности) — закрытый код и централизованная архитектура, открывающие возможности для прослушивания разговоров системой.
Современные SIP-VOIP приложения, использующие ZRTP-протокол, обеспечивают p2p-шифрование и аутентификацию, но, к сожалению, не распространены среди обычных пользователей и часто сложны в настройке. Идеально смотрятся децентрализованные VOIP решения, использующие DHT (Tox) или Tor (OnioPhone), но сегодня они еще очень далеко от обычного пользователя и вряд ли станут ближе в скором будущем.
Оптимальным решением для обеспечения надежной защиты от прослушивания при сохранении доступности является использование p2p шифрования голосового канала Skype в виде плагина, выполняющего криптографически стойкую обработку речи с дальнейшей передачей Skype-клиенту через виртуальное аудиоустройство. Существуют два принципиально различные подходы, используемые для защиты речи. Классическим является применение скремблеров, обеспечивающих трансформацию во временной (перестановка коротких сегментов) или частотной (перестановка формант) области. По сегодняшним меркам подобные решения не обеспечивают криптографически стойкой защиты. В первую очередь это связано с особенностями статистики речевого сигнала: зная алгоритм трансформации, на современных CPU можно эффективно подобрать ключ произведенной перестановки, анализируя статистику результата. Более надежным является передача речи в виде данных, зашифрованных с использованием современных криптографических алгоритмов с достаточной длиной ключа. Для преобразования речи в поток данных используются низкобитрейные аудио кодеки, обеспечивающие значительное сжатие при сохранении «телефонного» качества. Важно, чтобы полученный поток данных можно было передать через полосу пропускания имеющегося голосового канала, представляемого VOIP.
Кроме ограничения Найквиста, в данном случае важную роль играет дополнительный фактор сжатия голосового канала кодеком, примененным в базовом VOIP. В частности, Skype до недавнего времени преимущественно использовал Silk, анонсировав переход на Opus; различные SIP-решения могут использовать кодеки G729, G723 или Speex; сотовая связь использует семейства GSM и AMR (в том числе их тандемы) и т.д. Все эти кодеки спроектированы для сжатия человеческой речи и вносят значительные искажения в неречевые сигналы, передаваемые через голосовой канал.
Для передачи данных через голосовой канал обычно используется модем — устройство, преобразующее поток данных в звуковой сигнал, пригодный для передачи через канал с определенными параметрами (полоса пропускания, соотношение сигнал/шум, амплитудно/частотная характеристика и т.д.). Классические акустические модемы чаще всего выполняют амплитудную (ASK), частотную (FSK) или фазовую (PSK) модуляции несущей, а также частотное уплотнение в виде нескольких несущих (OFDM), модулированных одним из указанных способов. В случае использования речевого кодека канал не является AWGN и имеет память: его текущий отклик зависит от предыдущих сигналов. При этом наблюдаются значительные искажения модулированного сигнала, приводящие к значительной межсимвольной интерференции (ISI) и высокому уровню ошибок (BER). Для получения приемлемого BER необходимо использовать другие принципы модуляции, реализуя так называемый псевдоречевой модем, генерирующий сигналы, близкие по параметрам к человеческой речи и минимально искажаемые речевыми кодеками.
Первый известный мне проект p2p стойкого шифрования речи с использованием псевдоречевого модема, заявленный как OpenSource — это JackPair от команды разработчиков AWIT. Планировалось универсальное аппаратное решение с двумя аналоговыми аудио интерфейсами, обеспечивающее первичное Диффи-Хеллманн согласование ключей, сжатие речи с использованием CODEC2, шифрование потока AES в режиме CTR, передача через любой речевой канал (в том числе между двумя GSM-телефонами) с помощью специально спроектированного псевдоречевого модема. После анонса на Kickstarter в августе 2014 года проект вызвал огромный интерес, в том числе и в блоге Брюса Шнайера. К сожалению, разработчики вполне предполагаемо не учли теоретической сложности проектирования псевдоречевого модема, пригодного для реальных сотовых сетей и работающего с аналоговыми интерфейсами современных телефонов. Проект так и не был реализован, обещанные исходные коды не опубликованы.
Проблема разработки псевдоречевого модема, эффективного при работе через сжатые речевые каналы (особенно в реальных GSM сетях) сегодня активно исследуется и отображается в свежих публикациях. Актуальность определяется не только отсутствием эффективных решений для р2р шифрования речи, но и возможностью интеграции в «умный дом» и его бытовую технику (например, связь с сервис-центром через мобильный телефон пользователя), в POS-терминалы, системы сигнализации и телеметрии на базе GSM. Показательным является открытая разработка компанией Qualcomm единого стандарта надежного псевдоречевого модема для системы экстренной помощи на транспорте еCall, позволяющего передать стандартный пакет данных, содержащий координаты и тип аварии, в службу спасения через любой доступный речевой канал.
Существует несколько подходов к проектированию псевдоречевых модемов. Первый — использование стандартных модуляций с параметрами несущих сигналов, адаптированными к предполагаемым речевым кодекам. Данный подход самый простой и позволяет использовать имеющиеся программные решения для модемов, но, как правило, не обеспечивает необходимой скорости передачи при допустимом BER. Второй подход — использование алфавита, состоящего из сегментов, специально отобранных из речевых баз или сформированных синтетически, оптимально проходящих через сжатый канал с сохранением Хеммингова расстояния, достаточного для заданной величины BER. Подобные решения являются наиболее эффективными, но требуют значительной вычислительной мощности, сложной синхронизации, а также тщательной предварительной селекции алфавитного набора путем последовательных итераций на модели предполагаемого сжатого канала. Третий подход, оптимальный по соотношению «затраты/качество», состоит в выборе сигналов, исходя из принципа работы предполагаемых кодеков (их LPC-анализа, кодовых книг, последующего квантования и т.п.). Именно этот подход использован при разработке модема для eCall.
Учитывая актуальность и теоретическую сложность проблемы, мы также попытались внести посильную лепту в ее решение и предложили оригинальный псевдоречевой модем, адаптированный к задаче p2p шифрования речи в сжатом голосовом канале. После изучения имеющихся решений и исследований, а также многочисленных собственных экспериментов с использованием фреймворков кодеков GSM-HR, GSM-FR, GSM-EFR, AMR, BroadBand, ILBC, G723, G729, Speex, Silk, Opus, в том числе в составе реальных VOIP и GSM/CDMA каналов, выбор пал на BPSK модуляцию с параметрами несущей, строго адаптированными к алгоритму GSM-FR кодека: 1333 Гц при шести 8КГц-сэмплах на бит. Дополнительно использовалась специальная асимметричная форма несущего сигнала, вводилась управляемая межсимвольная интерференция, а также периодически изменялся уровень сигнала для блокировки голосового детектора (VAD), используемого преимущественно в GSM. Когерентный демодулятор с динамическим эквалайзером обеспечивал фазовую синхронизацию при разнице в частоте сэмлирования аудиоустройств до 2% от номинальной 48КГц. С учетом минимальной FEC (r=9/10) достигалась потоковая скорость 1200 бод при значении BER менее 1%.
Для сжатия речи использовался ультранизкобитрейный кодек MELPE-1200 (STANAG-4591), работающий с фреймами длительностью 67.5 мсек, сжимая их до 81 бит. Фреймовая синхронизация осуществлялась при помощи предсказуемых битов четности, также выполняющих функцию синхро-вставки и позволяла с минимальным оверхедом уверенно синхронизировать модем без использования стартовой синхро-последовательности и с возможностью восстановления менее чем за 200 мсек потока. Модем также обеспечивал строгую синхронизацию во времени однонаправленных счетчиков фреймов. Согласование счетчиков было возможно в паузах речи, определяемых встроенным VAD, во время которых передавался номер текущего фрейма в сеансе. Общая задержка с учетом буферизации, необходимой для работы аналоговых аудиоустройств на РС и кодека, составила около 250 мсек.
В качестве асимметричного криптографического примитива использовался протокол Диффи-Хеллман на эллиптической кривой 25519 с 256-битными публичными ключами в формате Монтгомери. Ключевой обмен проводился двухэтапно: сначала стороны обменивались первыми 224 битами, одновременно выполняющими функцию обязательства (commitment), а затем — оставшимися 32 битами ключей, окончательно определяющими общий секрет. Таким образом, с целью ускорения обмена удалось исключить предварительный обмен отдельными обязательствами для ключей, необходимый при сравнении коротких (всего 13 бит в виде пин — кода из 4 цифр) отпечатков секрета для обнаружения атаки «человек — посредине».
Для первичного согласования ключей (IKE) использовался протокол TripleDH, обеспечивающий совершенную обратную секретность (PFS) для каждого сеанса, устойчивый к атакам с неизвестным сеансовым ключом (UKS) и подмены идентичности при утечке долговременного ключа (KCI). Долговременные ключи для каждого контакта создавались при первичном «спаривании» устройств и хранились в адресной книге, в дальнейшем обеспечивая автоматическую идентификацию и неявную аутентификацию каждого сеанса. Обеспечивалась защита идентов от активного и пассивного атакующего. Дополнительно была реализована возможность выполнения явной аутентификации с помощью согласованного пароля с нулевым разглашением однократно перед «спариванием», а также во время каждого сеанса для обеспечения скрытого уведомления о принуждении.
В качестве потокового шифрования в пределах 81 битного блока использовалась Keccak (SHA3) в режиме 576/1600 Sponge Duplexing, блочный режим CTR исключал распространения битовой ошибки в условиях постоянного BER. В качестве HASH, MAC, KDF также использовалась Keccak без дополнительных алгоритмов как доказуемо пригодная для этих целей. Встроенный генератор псевдослучайных чисел опять же на базе Keccak сидировался с помощью HAVEGE, а также от системного RAND.
Для реализации аудио интерфейсов были выбраны низкоуровневые библиотеки wave в Windows и alsa в Linux. Требовалось наличие как минимум двух дуплексных аудиоустройств в системе: для гарнитуры и линии. В качестве дополнительно устройства использовались USB карта, Bluetooth-гарнитура или виртуальный аудио-кабель (audio loop), позволяющие реализовать как отдельный физический шифратор речи с аналоговой линией, так и программный шифромодуль, работающий параллельно со штатным VOIP, настроенным на виртуальное аудиоустройство.
Тестовый кроссплатформенный проект с открытым исходным кодом представлен на GitHub. Тестирование с использованием Skype показало противоречивые результаты. Отклик канала постоянно менялся вследствие автоматической настройки параметров сжатия в зависимости от полы интернет-соединения. Кроме того, встроенные в Skype алгоритмы эхоподавления периодически значительно ухудшал качество модемного сигнала вплоть до потери фазовой синхронизации модема. При тестировании связи через GSM-линки с использованием отладочных плат с GSM-модулями Quectel M66 результаты тоже не особо радовали: в определенных условиях сотовый оператор добавлял дополнительные каскады AMR-транскодирования независимо от выбора GSM FR кодека в инженерном меню GSM-модулей, что значительно повышало BER и требовало переустановки звонка.
Таким образом, проблема p2p-шифрования речи в существующих VOIP решениях остается в целом нерешенной и требует дальнейших исследований для разработки эффективных псевдоречевых модемов, пригодных для сжатых голосовых каналов. Любые свежие идеи, возможно, станут основой эффективных алгоритмов для реализации надежного модемного соединения, обеспечивающего скорость как минимум 1200 бод при менее 1% битовых ошибок.
Современные SIP-VOIP приложения, использующие ZRTP-протокол, обеспечивают p2p-шифрование и аутентификацию, но, к сожалению, не распространены среди обычных пользователей и часто сложны в настройке. Идеально смотрятся децентрализованные VOIP решения, использующие DHT (Tox) или Tor (OnioPhone), но сегодня они еще очень далеко от обычного пользователя и вряд ли станут ближе в скором будущем.
Оптимальным решением для обеспечения надежной защиты от прослушивания при сохранении доступности является использование p2p шифрования голосового канала Skype в виде плагина, выполняющего криптографически стойкую обработку речи с дальнейшей передачей Skype-клиенту через виртуальное аудиоустройство. Существуют два принципиально различные подходы, используемые для защиты речи. Классическим является применение скремблеров, обеспечивающих трансформацию во временной (перестановка коротких сегментов) или частотной (перестановка формант) области. По сегодняшним меркам подобные решения не обеспечивают криптографически стойкой защиты. В первую очередь это связано с особенностями статистики речевого сигнала: зная алгоритм трансформации, на современных CPU можно эффективно подобрать ключ произведенной перестановки, анализируя статистику результата. Более надежным является передача речи в виде данных, зашифрованных с использованием современных криптографических алгоритмов с достаточной длиной ключа. Для преобразования речи в поток данных используются низкобитрейные аудио кодеки, обеспечивающие значительное сжатие при сохранении «телефонного» качества. Важно, чтобы полученный поток данных можно было передать через полосу пропускания имеющегося голосового канала, представляемого VOIP.
Кроме ограничения Найквиста, в данном случае важную роль играет дополнительный фактор сжатия голосового канала кодеком, примененным в базовом VOIP. В частности, Skype до недавнего времени преимущественно использовал Silk, анонсировав переход на Opus; различные SIP-решения могут использовать кодеки G729, G723 или Speex; сотовая связь использует семейства GSM и AMR (в том числе их тандемы) и т.д. Все эти кодеки спроектированы для сжатия человеческой речи и вносят значительные искажения в неречевые сигналы, передаваемые через голосовой канал.
Для передачи данных через голосовой канал обычно используется модем — устройство, преобразующее поток данных в звуковой сигнал, пригодный для передачи через канал с определенными параметрами (полоса пропускания, соотношение сигнал/шум, амплитудно/частотная характеристика и т.д.). Классические акустические модемы чаще всего выполняют амплитудную (ASK), частотную (FSK) или фазовую (PSK) модуляции несущей, а также частотное уплотнение в виде нескольких несущих (OFDM), модулированных одним из указанных способов. В случае использования речевого кодека канал не является AWGN и имеет память: его текущий отклик зависит от предыдущих сигналов. При этом наблюдаются значительные искажения модулированного сигнала, приводящие к значительной межсимвольной интерференции (ISI) и высокому уровню ошибок (BER). Для получения приемлемого BER необходимо использовать другие принципы модуляции, реализуя так называемый псевдоречевой модем, генерирующий сигналы, близкие по параметрам к человеческой речи и минимально искажаемые речевыми кодеками.
Первый известный мне проект p2p стойкого шифрования речи с использованием псевдоречевого модема, заявленный как OpenSource — это JackPair от команды разработчиков AWIT. Планировалось универсальное аппаратное решение с двумя аналоговыми аудио интерфейсами, обеспечивающее первичное Диффи-Хеллманн согласование ключей, сжатие речи с использованием CODEC2, шифрование потока AES в режиме CTR, передача через любой речевой канал (в том числе между двумя GSM-телефонами) с помощью специально спроектированного псевдоречевого модема. После анонса на Kickstarter в августе 2014 года проект вызвал огромный интерес, в том числе и в блоге Брюса Шнайера. К сожалению, разработчики вполне предполагаемо не учли теоретической сложности проектирования псевдоречевого модема, пригодного для реальных сотовых сетей и работающего с аналоговыми интерфейсами современных телефонов. Проект так и не был реализован, обещанные исходные коды не опубликованы.
Проблема разработки псевдоречевого модема, эффективного при работе через сжатые речевые каналы (особенно в реальных GSM сетях) сегодня активно исследуется и отображается в свежих публикациях. Актуальность определяется не только отсутствием эффективных решений для р2р шифрования речи, но и возможностью интеграции в «умный дом» и его бытовую технику (например, связь с сервис-центром через мобильный телефон пользователя), в POS-терминалы, системы сигнализации и телеметрии на базе GSM. Показательным является открытая разработка компанией Qualcomm единого стандарта надежного псевдоречевого модема для системы экстренной помощи на транспорте еCall, позволяющего передать стандартный пакет данных, содержащий координаты и тип аварии, в службу спасения через любой доступный речевой канал.
Существует несколько подходов к проектированию псевдоречевых модемов. Первый — использование стандартных модуляций с параметрами несущих сигналов, адаптированными к предполагаемым речевым кодекам. Данный подход самый простой и позволяет использовать имеющиеся программные решения для модемов, но, как правило, не обеспечивает необходимой скорости передачи при допустимом BER. Второй подход — использование алфавита, состоящего из сегментов, специально отобранных из речевых баз или сформированных синтетически, оптимально проходящих через сжатый канал с сохранением Хеммингова расстояния, достаточного для заданной величины BER. Подобные решения являются наиболее эффективными, но требуют значительной вычислительной мощности, сложной синхронизации, а также тщательной предварительной селекции алфавитного набора путем последовательных итераций на модели предполагаемого сжатого канала. Третий подход, оптимальный по соотношению «затраты/качество», состоит в выборе сигналов, исходя из принципа работы предполагаемых кодеков (их LPC-анализа, кодовых книг, последующего квантования и т.п.). Именно этот подход использован при разработке модема для eCall.
Учитывая актуальность и теоретическую сложность проблемы, мы также попытались внести посильную лепту в ее решение и предложили оригинальный псевдоречевой модем, адаптированный к задаче p2p шифрования речи в сжатом голосовом канале. После изучения имеющихся решений и исследований, а также многочисленных собственных экспериментов с использованием фреймворков кодеков GSM-HR, GSM-FR, GSM-EFR, AMR, BroadBand, ILBC, G723, G729, Speex, Silk, Opus, в том числе в составе реальных VOIP и GSM/CDMA каналов, выбор пал на BPSK модуляцию с параметрами несущей, строго адаптированными к алгоритму GSM-FR кодека: 1333 Гц при шести 8КГц-сэмплах на бит. Дополнительно использовалась специальная асимметричная форма несущего сигнала, вводилась управляемая межсимвольная интерференция, а также периодически изменялся уровень сигнала для блокировки голосового детектора (VAD), используемого преимущественно в GSM. Когерентный демодулятор с динамическим эквалайзером обеспечивал фазовую синхронизацию при разнице в частоте сэмлирования аудиоустройств до 2% от номинальной 48КГц. С учетом минимальной FEC (r=9/10) достигалась потоковая скорость 1200 бод при значении BER менее 1%.
Для сжатия речи использовался ультранизкобитрейный кодек MELPE-1200 (STANAG-4591), работающий с фреймами длительностью 67.5 мсек, сжимая их до 81 бит. Фреймовая синхронизация осуществлялась при помощи предсказуемых битов четности, также выполняющих функцию синхро-вставки и позволяла с минимальным оверхедом уверенно синхронизировать модем без использования стартовой синхро-последовательности и с возможностью восстановления менее чем за 200 мсек потока. Модем также обеспечивал строгую синхронизацию во времени однонаправленных счетчиков фреймов. Согласование счетчиков было возможно в паузах речи, определяемых встроенным VAD, во время которых передавался номер текущего фрейма в сеансе. Общая задержка с учетом буферизации, необходимой для работы аналоговых аудиоустройств на РС и кодека, составила около 250 мсек.
В качестве асимметричного криптографического примитива использовался протокол Диффи-Хеллман на эллиптической кривой 25519 с 256-битными публичными ключами в формате Монтгомери. Ключевой обмен проводился двухэтапно: сначала стороны обменивались первыми 224 битами, одновременно выполняющими функцию обязательства (commitment), а затем — оставшимися 32 битами ключей, окончательно определяющими общий секрет. Таким образом, с целью ускорения обмена удалось исключить предварительный обмен отдельными обязательствами для ключей, необходимый при сравнении коротких (всего 13 бит в виде пин — кода из 4 цифр) отпечатков секрета для обнаружения атаки «человек — посредине».
Для первичного согласования ключей (IKE) использовался протокол TripleDH, обеспечивающий совершенную обратную секретность (PFS) для каждого сеанса, устойчивый к атакам с неизвестным сеансовым ключом (UKS) и подмены идентичности при утечке долговременного ключа (KCI). Долговременные ключи для каждого контакта создавались при первичном «спаривании» устройств и хранились в адресной книге, в дальнейшем обеспечивая автоматическую идентификацию и неявную аутентификацию каждого сеанса. Обеспечивалась защита идентов от активного и пассивного атакующего. Дополнительно была реализована возможность выполнения явной аутентификации с помощью согласованного пароля с нулевым разглашением однократно перед «спариванием», а также во время каждого сеанса для обеспечения скрытого уведомления о принуждении.
В качестве потокового шифрования в пределах 81 битного блока использовалась Keccak (SHA3) в режиме 576/1600 Sponge Duplexing, блочный режим CTR исключал распространения битовой ошибки в условиях постоянного BER. В качестве HASH, MAC, KDF также использовалась Keccak без дополнительных алгоритмов как доказуемо пригодная для этих целей. Встроенный генератор псевдослучайных чисел опять же на базе Keccak сидировался с помощью HAVEGE, а также от системного RAND.
Для реализации аудио интерфейсов были выбраны низкоуровневые библиотеки wave в Windows и alsa в Linux. Требовалось наличие как минимум двух дуплексных аудиоустройств в системе: для гарнитуры и линии. В качестве дополнительно устройства использовались USB карта, Bluetooth-гарнитура или виртуальный аудио-кабель (audio loop), позволяющие реализовать как отдельный физический шифратор речи с аналоговой линией, так и программный шифромодуль, работающий параллельно со штатным VOIP, настроенным на виртуальное аудиоустройство.
Тестовый кроссплатформенный проект с открытым исходным кодом представлен на GitHub. Тестирование с использованием Skype показало противоречивые результаты. Отклик канала постоянно менялся вследствие автоматической настройки параметров сжатия в зависимости от полы интернет-соединения. Кроме того, встроенные в Skype алгоритмы эхоподавления периодически значительно ухудшал качество модемного сигнала вплоть до потери фазовой синхронизации модема. При тестировании связи через GSM-линки с использованием отладочных плат с GSM-модулями Quectel M66 результаты тоже не особо радовали: в определенных условиях сотовый оператор добавлял дополнительные каскады AMR-транскодирования независимо от выбора GSM FR кодека в инженерном меню GSM-модулей, что значительно повышало BER и требовало переустановки звонка.
Таким образом, проблема p2p-шифрования речи в существующих VOIP решениях остается в целом нерешенной и требует дальнейших исследований для разработки эффективных псевдоречевых модемов, пригодных для сжатых голосовых каналов. Любые свежие идеи, возможно, станут основой эффективных алгоритмов для реализации надежного модемного соединения, обеспечивающего скорость как минимум 1200 бод при менее 1% битовых ошибок.