Arduino обеспечивает двустороннюю связь по радио

rf

Я хотел бы реализовать защищенные каналы связи между двумя Arduino, взаимодействующими через радиомодули 433 МГц (точнее, с использованием базовых чипов Atmega 326).

Я знаю, что нехватка ресурсов — проблема чипов Atmega. Лучшей отправной точкой, которую я смог найти, была эта библиотека, которая так и не была написана:

https://forum.arduino.cc/index.php?topic=314845.0

Я вижу это так, что неважно, какой тип кодировки мы используем, если злоумышленник может перехватить и воспроизвести этот OTA, между устройствами должен быть второй компонент, который неизвестен злоумышленнику и изменяется так же, как таймер на основе DS. Если клиент может зашифровать свои сообщения с помощью key=timeXpassword key->encrypt(datatobesent), то сервер может расшифровать их таким же образом, если они поступят в правильный период времени, например +-/5 секунд, где время не обязательно должно быть текущим точным временем, просто часы, которые синхронизированы между устройствами. Когда сообщение получено сервером, он вычислит 5 различных возможных данных для 5 секунд и проверит расшифрованные данные на наличие определенной строки, чтобы определить, является ли это ДЕЙСТВИТЕЛЬНЫМ пакетом данных.

Для этого снова понадобится внешняя схема таймера, например, серии DSXXXX, поскольку внутренний таймер в чипе ненадежен/через некоторое время переполняется.

Есть ли еще идеи для безопасной связи?

, 👍2


2 ответа


1

Возможно, вам захочется взглянуть на мой алгоритм RC4 с диффузией RC4D, который очень экономичен в плане ресурсов, поскольку занимает менее 500 байт флэш-памяти (при шифровании на месте) и работает намного быстрее, чем AES128 на Arduino.

,

RC4 больше не следует использовать в криптографических приложениях; он устарел., @dandavis


2

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

Идея здесь заключается в том, что «отправитель» сначала отправляет запрос «получателю» со словами «Впустите меня».

Затем «получатель» отправляет обратно сообщение: «Хорошо, вот ваш сеансовый ключ».

Затем «отправитель» шифрует учетные данные соединения, используя этот сеансовый ключ каким-либо образом (или шифрует их каким-либо образом, включая этот ключ вместе с учетными данными) — в идеале с помощью алгоритма хэширования с лазейкой, и отправляет их «получателю».

Затем «получатель» выполняет ту же операцию с данными, которые, как он ожидает, должен отправить «отправитель», и сравнивает их с тем, что он получил.

Если они совпадают, то «получатель» может разрешить связь с этим «клиентом». Затем «получатель» отправит новый ключ сеанса «отправителю», который затем будет использоваться для шифрования всей последующей связи. Этот ключ должен отличаться от первого и должен использовать симметричное шифрование.

Все это означает, что:

  • Ключ аутентификации каждый раз меняется — его невозможно «переиграть»
  • Ключ связи меняется с каждым сеансом, поэтому снова нет возможности воспроизвести сообщения в более поздние сроки, поскольку ключ будет неверным.

Да, при использовании этого метода возникает много накладных расходов, но он безопасен.

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

,