далее... упростим алгоритм шифрования.
1- уберём имитовставку (MAC)... и сделаем простой блочный шифр без вставок))
шифрование в режиме счётчика...
2-добавим генератор случайных чисел для повышения энтропии...
всё работает))
далее... имитовставка (MAC)
как написано в справочнике...
"имитовставка (MAC) нужна для аутентификации открытых данных прикреплённых к сообщению..."
у нас нет "открытых данных прикреплённых к сообщению..."
поэтому имитовставка (MAC) нам не нужна...
далее...
как написано в справочнике...
"для обеспечения семантической безопасности (невозможность злоумышленника при многократном использовании схемы под одним и тем же ключом получить отношения между сегментами зашифрованных сообщений),..."
надо периодически менять ключи...
значит добавим сессионные ключи...
теперь все устройства сами генерируют сессионные ключи...
и сами обмениваются сессионными ключами использую общий секретный ключ...
ещё добавим автовыбор ключей...
-передатчик выбирает из списка сессионный ключ... шифрует сообщение... отправляет приёмнику...
-приёмник расшифровывает сообщения используя те же сессионные ключи из общего списка...
работает))
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
алгоритм Диффи-Хеллмана на эллиптических кривых, аутентификация сервера будет производится с помощью ECDSA, а в качестве алгоритма шифрования трафика будет использоваться AES с длиной ключа 128 бит в режиме GCM. В качестве алгоритма MAC используется SHA256.
для обмена сессионными ключами можно использовать ECDHE... но есть две проблемы.
1. публичный ключ... 4096... в ATmega328 не влезет...
2. по заявлению учёных через ~5 лет ECDHE будет взломан))
https://www.youtube.com/watch?v=f5slLeCz7p8а зачем нам использовать шифры... которым жить осталось не долго))
SHA256 в ATmega328 влезет... но я не уверил нужен ли он нам...
с одной сторы SHA256 повышает надёжность...
с другой стороны возрастает вычислительная сложность... увеличивается время передачи... и другие ресурсы ATmega328.
и последнее...
https://ru.wikipedia.org/wiki/AEAD-режи ... шифрования"Важно, что и AE-схемы, и AEAD-схемы требуют использования nonce. Это необходимо для обеспечения семантической безопасности (невозможность злоумышленника при многократном использовании схемы под одним и тем же ключом получить отношения между сегментами зашифрованных сообщений), а также для защиты от атаки повторного воспроизведения, при которой злоумышленник под видом легального пользователя повторно отправляет сообщение. Генерация nonce и использование его только единожды ложится на ответственность отправителя. Для этого можно использовать, например, счетчик."
-для семантической безопасности будем использовать сессионные ключи.
-для защиты от атаки повторного воспроизведения будем использовать счетчик.
теперь другая проблема))
вместе с ключами ATmega328 должна ещё хранить и счётчик... а где его хранить ?))
-в рабочем режиме счётчик хранится в RAM...
при отключении питания счётчик обнуляется.. .и вся безопасность летит коту под хвост))
-можно перед отключением питания сделать автосохранение в EEPROM... но это усложнит схему и снизит надежность...
-ещё варианты...
так как нам безопасно передать сессионные ключи на все устройства ?
а что нам подсказывает справочник ?
справочник предлагает нам использовать Nonce...
https://ru.wikipedia.org/wiki/Nonce"Сервер генерирует случайный код (nonce) и посылает его клиенту. Клиент использует полученный код, добавляя его к паролю до шифрования, шифрует полученную строку, и возвращает получившееся сообщение серверу. Сервер расшифровывает сообщение, из полученной строки «вычитает» известный ему nonce и сверяет пароль. Данный nonce используется один и только один раз, все последующие передачи паролей с тем же nonce будут отвергнуты сервером, поэтому злоумышленник, перехватив сообщение с зашифрованным паролем, не сможет получить доступ, повторно отправляя перехваченное сообщение на сервер."
Во ! Замечательная идея)) ATmega328 это умеет. Так и сделаем. ))
для большей безопасности можно ещё добавить метку времени... чтобы обеспечить уникальность nonce для сеанса аутентификации...
только с этим будут проблемы... т.к. у ATmega328 нет системных часов))
зато у всех гаджетов есть системные часы...
вообщем картина в целом ясна.
-для передачи сообщений будем использовать сессионные ключи.
-а для передачи сессионных ключей будем использовать общий секретный ключ по алгоритму Nonce (для гаджетов добавим метку времени).
замечательно)))