Как сделать интернет вещей безопасным — объясняем простыми словами сложные криптографические схемы

Публикуем вторую статью Константина Жиданова с кафедры технологий защиты информации ГУАП, с которыми Tproger будет совместно участвовать в Фестивале ВКонтакте 16–17 июля. На нашей площадке будет оборудована «квартира будущего» с активным применением интернета вещей. И вопросам безопасности уделено большое внимание. Приходите посмотреть и потрогать всё самостоятельно, а мы с удовольствием расскажем, как это работает.

Передаём слово Константину.

Иллюзия безопасности

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

Нельзя сказать, чтобы это утверждение было совсем уж неверным, однако, дьявол кроется в деталях. Даже если опустить все вопросы, связанные с тем как какой режим шифрования вы намереваетесь использовать, остаётся один, самый главный вопрос — где и как хранится ключ шифрования? Особенно остро этот вопрос встаёт, когда дело касается интернета вещей.

Доверять можно только себе

Дело в том, что с ключами связано понятие, называемое компрометацией ключа – пренеприятнейшее событие, когда ключ шифрования становится известен злоумышленнику. Сразу отметим, что компрометация ключа — естественная вещь. Никакая обфускация кода, шифрование исполнимого файла или DRM не спасут вас от того, что хакер распотрошит ваше устройство и разберёт программу по байтам. Перед тем как сомневаться, почитайте, как в 2008 году ребята из Голландии нашинковали лазером смарт-карту, чтобы по структуре полупроводниковых переходов изучить работу алгоритма шифрования Crypto-1. Одно из правил безопасности, сформулированных Microsoft, гласит: если злоумышленник имеет физический доступ к вашему компьютеру — это больше не ваш компьютер. Когда вы теряете из вида свой агент интернета вещей, сразу же исходите из того, что все его ключи шифрования скомпрометированы.

Выходит, если в сети интернета вещей каждое из устройств шифрует трафик симметричным шифром с одним и тем же ключом, это потенциально небезопасно. При компрометации одного устройства скомпрометированной оказывается вся система — злоумышленник сможет читать весь трафик, а также фальсифицировать его. Таким образом, схему безопасности интернета вещей нельзя основывать на симметричных шифрах, таких как AES или ГОСТ 28147-89, несмотря на их криптостойкость.

Как генерировать ключи шифрования?

Любители криптографии могут вспомнить об ассиметричном шифровании и схеме PKI, когда каждому устройству предоставляется индивидуальный сертификат открытого ключа, подписанный центром сертификации. Тогда, при компрометации любого из устройств, злоумышленник сможет читать (и подменять) трафик, относящийся лишь к этому устройству. Однако, если мы вспомним суть концепции интернета вещей, то появится следующий вопрос — кто будет выдавать новому устройству сертификат открытого ключа, если центр сертификации отсутствует?

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

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

К счастью, математика даёт нам возможность выдавать валидные ключи шифрования от имени центра сертификации, даже не имея с ним связи. Базовую идею того, как это работает, можно понять, вспомнив несложную математику.

Интерполяция полинома

На самом деле, задача о разбиении секрета является классической, и лучше всего описана Брюсом Шнайером. Представим себе, что для запуска ядерной ракеты на пульте управления надо ввести секретное число. Мы не хотим доверять секрет конкретному офицеру — он может оказаться шпионом, или сойти с ума. Кроме того, всегда есть опасность, что по дороге на работу ему на голову упадёт бетонная плита, и тогда секрет будет безвозвратно утерян. Сообщив это секретное число нескольким лицам, мы полностью потеряем контроль над ситуацией, ведь вероятность того, что среди них хотя бы один шпион или псих резко возрастёт.

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

Пусть нам надо разделить секретное значение b между n участниками, чтобы восстановить секрет могли как минимум двое из них. Сгенерируем случайное число a и построим функцию f(x) = ax + b. Каждому из n участников сгенерируем случайное xi≠0 и вычислим yi=f(xi). Назовём yi тенью участника i. Тень каждого участника передаётся ему и является его маленьким секретом. Все полученные точки (xi, yi) лежат на одной прямой, поэтому через любые две из них можно провести единственную прямую, которая будет пересекать ось ординат как раз в значении b. В то же время, через одну точку можно провести бесконечное множество прямых, поэтому только по своей тени никакой из участников не может узнать значение секрета b.

Например, разделим число 5 между пятью участниками так, чтобы восстановить его могли как минимум двое из них. Выберем случайное число a, например 0.5, тогда f(x) = 0.5x + 5. Сгенерируем пять случайных чисел (-12, -8, -4, 2, 8) и вычислим значения f(x) от каждого из них. Тогда участникам достанутся тени -1, 1, 3, 6, 9 соответственно. Второй участник не сможет восстановить секрет, зная только свою точку (-8; 1). Но вместе со третьим (-4; 3) они восстановят прямую и секрет 5.

g1Для разделения секрета на большее число участников достаточно выбрать полином более высокой степени. Так, парабола задаётся полиномом ax2+bx+c и может быть восстановлена только по трём точкам.

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

Разумеется, при использовании этой схемы в компьютере никто не будет чертить графики. Для вычисления значения функции в заданной точке будет использован описанный ещё в 18 веке интерполяционный полином Лагранжа. Кроме того, если при вычислениях использовать рациональные числа (тип float или double), то потеря точности при округлениях будет неизбежна. Поэтому в реальных устройствах все вычисления производятся в полях Галуа.

Этот механизм называется пороговой схемой (k, n) (читается «k из n»), а описан он был знаменитым Ади Шамиром, одним из авторов RSA. Собственно, сейчас этот приём известен как схема Шамира.

Протоколы безопасности

Несмотря на криптографическую надёжность, эта схема имеет важный недостаток — мы должны безоговорочно доверять сборщику (тому устройству, которое восстанавливает секрет). Как мы уже выяснили раньше, в интернете вещей таких достоверных устройств почти не существует. Поэтому требуется специальный протокол (правила манипуляции тенями устройств), чтобы ни одно устройство не узнало тени других участников процесса, а сам секрет даже не восстанавливался в процессе работы. Кроме того, если мы используем схему Шамира для генерации новой тени, её значение не должны знать те, кто её генерируют. Обсуждение этого протокола выходит за рамки этой статьи, но подробное его описание, а так же расширение для работы с групповой подписью можно прочитать в работе S. Bezzateev, Y. Koucheryavy, A. Ometov, K. Zhidanov, R. Florea, S. Andreev, Securing Network-Assisted Direct Communication: The Case of Unreliable Cellular Connectivity, Proceedings of IEEE Trustcom/BigDataSE/ISPA, p..826-829, 2015.

Константин Жиданов, кафедра технологий защиты информации ГУАП