Pull to refresh
2970.6
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Защита данных супершифратором Cipherbox

Reading time11 min
Views10K
Original author: Northstrix

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

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

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

В этом устройстве задействуется шесть алгоритмов шифрования, а также хранилище, защищаемое с помощью четырёх RFID-карт, имени пользователя и пароля. При этом использовать Cipherbox может много людей одновременно, не мешая друг другу (думаю, можно даже сделать на основе этого сервис).

Состоит разработанное мной устройство из трёх микроконтроллеров: ESP32, Arduino Uno и ESP8266.

  • ESP32 – это его основа. Все алгоритмы шифрования и SQLite выполняются на нем.
  • Arduino Uno служит в качестве драйвера клавиатуры и посредником между ESP32 и RFID-ридером.
  • ESP8266 – это ресивер, который выполняет только алгоритм AES+Serpent в режиме дешифровки.

▍ Компоненты




Компоненты хранилища:

  • ESP32 x1;
  • Arduino Uno x1;
  • 2.4” TFT LCD c ILI9341 x1;
  • Mifare RC522 x1;
  • RFID-карты x4;
  • клавиатура PS/2 x1;
  • порт PS/2 x1;
  • резисторы 580Ом x2;
  • светодиод x1;
  • конденсатор 10мкФr x1, необязателен.

Компоненты ресивера:

  • ESP8266 x1;
  • дисплей Nokia 5110 x1.

▍ Шаг 1: алгоритмы шифрования


Из 6 используемых в этом устройстве алгоритмов 4 выполняют так называемое супершифрование.



Больше фото










Согласно определению NIST, супершифрование – это операция шифрования, при которой входящим текстом для преобразования выступает шифротекст, полученный из предыдущей операции шифрования.

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

А теперь перейдём к описанию.

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

  • Blowfish + AES + Serpent + AES – это самый мощный алгоритм, используемый в этом устройстве. Получая на входе 8 символов, он выдаёт 64. (Уверен, его также можно отнести к разряду устойчивых против квантовых атак).
  • AES + Serpent + AES практически аналогичен Blowfish + AES + Serpent + AES, за исключением отсутствия Blowfish.
  • Serpent + AES уже несколько слабее предыдущих двух, но всё равно достаточно силен для защиты данных.
  • Blowfish + Serpent – это алгоритм, который на входе получает 8 символов, а на выходе выдаёт 32.
  • Serpent представляет собой голый минимум для защиты данных. Получая 8 символов, он также выдаёт 32.
  • AES. На вашем месте я бы обратил на него внимание. Используемую в рассматриваемом устройстве реализацию этого алгоритма я бы не назвал поистине безопасной. Она работает и вполне может шифровать данные, но при этом не задействует преимущества IV и случайных чисел. Этот алгоритм при повторном шифровании одного и того же сообщения будет выдавать один и тот же шифротекст, что делает его уязвимым для атак с выбором открытого текста и особенно для криптоанализа. Добавил же я его сюда лишь потому, хотел дать вам возможность поиграться с «голым AES».

▍ Шаг 2: установка драйверов и настройка Arduino IDE *необязательно


Если вы раньше не занимались прошивкой ESP32 или ESP8266, то для загрузки программ на платы вам потребуется настроить Arduino IDE и установить драйвера. Вот все необходимые ссылки:


Настройка IDE в это руководство не входит, но вы можете почитать об этом здесь:


▍ Шаг 3: скачивание прошивки с GitHub




Прошивку можно взять здесь: https://github.com/Northstrix/Cipherbox

▍ Шаг 4: скачивание и установка библиотек



Распаковываются библиотеки стандартно. Можете извлечь содержимое архива в каталог: ...\Arduino\libraries, либо открыть Arduino IDE, кликнуть Sketch -> Include Library -> Add .ZIP Library... и выбрать каждый архив с библиотеками.

Остальные необходимые пакеты, так или иначе, уже присутствуют.

▍ Шаг 5: установка загрузчика файловой системы ESP32




Основная цель этого загрузчика – позволить вам загружать файлы в файловую систему ESP. В этом руководстве он будет использоваться для загрузки в ESP пустого образа SPIFFS.
Скачайте файл ESP32FS-1.0.zip отсюда: https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/

Затем извлеките его содержимое в каталог ...\Arduino\Tools\ и перезапустите Arduino IDE.

▍ Шаг 6: форматирование встроенной флэш-памяти ESP32




Кликните Tools -> ESP32 Sketch Data Upload. Далее во всплывающем окне кликните Yes, и программа отформатирует флэш-память микроконтроллера.

Некоторые платы удастся прошить без проблем, но, к сожалению, не все. Если вы правильно настроили IDE, установили драйверы, выбрали соответствующий порт и всё равно получаете ошибку A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header, подключите на время прошивки к плате конденсатор 10мкФ. Плюс нужно кинуть на контакт EN микроконтроллера, а минус (обычно обозначен серой полоской) на GND.

Не забудьте после прошивки конденсатор отключить.

▍ Шаг 7: генерация ключей


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



Лучше всего генерировать случайные ключи с помощью броска 20-гранного кубика.
Если выпадает число от 1 до 9, запишите его.

Если выпало число от 10 до 15, запишите соответствующую ему букву:

10 = A;
11 = B;
12 = C;
13 = D;
14 = E;
15 = F.

Если бросок показал 20, пишите 0.

В других случаях ничего не пишите, а перебросьте кубик.

Можно пойти и более простым путём. Я изменил один из своих предыдущих проектов для работы в качестве генератора чисел. Генерируемый им вывод для меня выглядит «достаточно случайным», но тесты я не проводил, так что гарантировать полную случайность не буду. Используйте на свой страх и риск.

Для генерации ключей запустите в каталоге Untested RNG файл gen.exe, после чего кликните по кнопке «Generate keys for Cipherbox». При нажатии этой кнопки фон сменится с чёрного на синий.

▍ Шаг 8: получение MAC-адреса ресивера




Для получения MAC-адреса ресивера загрузите в ESP8266 следующий код:

#include <ESP8266WiFi.h>

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}

Затем откройте Serial Monitor и перезагрузите плату.

Если всё сделать правильно, в консоли должен отобразиться MAC-адрес. Для данной платы это 5C:CF:7F:FD:85:1D.

▍ Шаг 9: изменение прошивки




Откройте файлы Firmware_for_ESP32.ino и Firmware_for_ESP8266.ino из каталогов Cipherbox-main\V1.0\Firmware_for_ESP32 и Cipherbox-main\V1.0\Firmware_for_ESP8266. В них нужно заменить мои ключи на те, что вы сгенерировали.

Хранилищу требуется шесть ключей, а ресиверу всего два. Убедитесь, что projection_key и proj_serp_key на обоих устройствах совпадают.

Не забудьте заменить MAC-адрес ресивера в строке uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0xFD, 0x85, 0x1D}; //Receiver's MAC address в файле Firmware_for_ESP32.ino.

▍ Шаг 10: прошивка Arduino


Загрузите прошивку из каталога Cipherbox-main\V1.0\Firmware_for_Arduino на Arduino.



▍ Шаг 11: прошивка ESP32


Загрузите прошивку из каталога Cipherbox-main\V1.0\Firmware_for_ESP32 на ESP32.



▍ Шаг 12: прошивка ESP8266


Загрузите прошивку из каталога Cipherbox-main\V1.0\Firmware_for_ESP8266 на ESP8266.



▍ Шаг 13: сборка хранилища


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



▍ Шаг 14: схема хранилища




▍ Шаг 15: сборка ресивера


Ресивер собирать ещё проще. Просто подключите дисплей к ESP8266.



▍ Шаг 16: схема ресивера




▍ Шаг 17: запитывание хранилища и считывание четырёх RFID-карт


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

Важно: если вы хотите перезагрузить ESP32, перезагружайте все платы. Если же вдруг перестанет корректно работать клавиатура, перезагрузите только Arduino Uno.

▍ Шаг 18: авторизация в хранилище


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







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

Если атакующий узнает имя пользователя, то сможет удалить все ваши учётные записи и заметки. Если же он узнает ещё и пароль, то сможет расшифровать всю информацию.

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

Для переключения между полями используйте «Tab». Текущее поле обозначается подписью снизу. Когда закончите ввод, жмите «Enter» для входа в хранилище.

Для пароля 1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./LKJHGFDSA?><MNBVCXZ+_(*&^%$#@! я получил верификационный номер 6117.

После попадания в главное меню — управление следующее:

  • клавиша ↓ для перемещения вниз.
  • клавиша ↑ для перемещения вверх.
  • клавиши ← и → изменение режима AES.

▍ Шаг 19: шифрование текста


Откройте Serial Monitor и установите скорость в бодах на 115200, так как шифротекст будет выводиться в Serial Monitor.







Для шифрования текста выберите в меню нужный алгоритм и нажмите на клавиатуре “1”. После этого введите целевой текст и нажмите “Enter”.

Вот что получилось у меня:

Открытый текст:
Cipherbox is what I consider to be a cryptographic swiss knife. The existence of this device wouldn't've been possible without a lot of open source code that I've found on the Internet and put together.

Шифротекст:

4c31cfb14b75d0ba0902f1c5fc243471dab7dca6e94fd89d07936b969bff63980311223bd62d9cf4d012235cf308e41c3c431f2e1ca78e3778341cc7ed21d2dd0f878187ff15d34fa42f8ede7c490ee3a18d81beed0599df1d4ad8619abef667ae5ba9cec776dc348e532e61f448c74883a2cd54c6f583ca3d10d01d2a2dd7bb682c8c2b579fec10a93772324e39db0afa09667b0b4b3631d033690b9868a32ccce7592bafb4280d46b3aa6ad44c0f51749fd7d7698944286342c9107690f90b0021d0d87ae831298f9f89dfc486b8f2d4ed36d901fa602a13fb7f9f7086fcd0f2da1ab23d65dc1cf87dd3eecff73a97d90ea16528d1a42f9d74bc7e2f742c80c2ba820f0195318eb680ffa7e69ca00a0c142f4edc05815412f58a9a5056a8620fc79e521c658d3865411baf1f41bfa88370124a400f36b4ae1dfa5e09036d22c9696c42faa7ec0020f9a9f417de42c04d60d92c941e7aa3f8f5aa305840de88a9b866e3b99966f556b45482c3c7b889db214fa642b395f61d64ddae03142742dc1e4c5300559bf9157af0c4ce3922d0f3843398a6ecbb2cb5eafd679f4ee814bfb7e3d675e16bc1c27cf8f97438454836a1ce806243da42292428f9e82e73eb5bcb55c45f55550cb0bce6b909bbd2f47fe2946c82148a12a4a28ed6d4fa435c6f6bd1cfa0961fd76ac3a23d7bfcfe3aad723e5898821ad4f6fb6a966b37e5343e028ceac0d562954ad7346d1d4ea04ed573feeeb3e4707e06f41777e7e77172caef4039b2c8a6f08e87f93a528d3591d3e90406a3bbf5ce4da651a129529c92c99da7c63d41b6ee645ebaa664950259f02f9e102a563d676cfc091371dd87321f3f99033399edb02631ddeb973801f1e310bbf4ca9a1aaec375a104baaddb3e0f0992b306a34db3505feb199c2e823f9e7f32cf42ea43d24dc494bd66e6bb9eca4f956a63195c17c7b6d1f345e4a0bcc50373d1d610fe143fa96046234832c62f58438242ac845fcbc00dccc121da6a902f53e467b7df936d3eed47da7548c92df0498d143db4a2a00cb1e8390b64a95f6f38c593b9e3e8587e88d1696ab52b71caa14d2d20fc7829b329c098ce87b576efdd761dd9e4a5d8fb0f1a6f9dab0bb28c5595fcb928215bc3e67695096de5c2107da3de17d49c436abc600eb58341

▍ Шаг 20: расшифровка текста




Откройте Serial Monitor и установите скорость в бодах на 115200, поскольку шифротекст нужно будет вставлять в Serial Monitor.

Для расшифровки выберите в меню алгоритм, который использовался для шифрования, и нажмите “2”. После этого вставьте шифротекст в Serial Monitor и нажмите “Send”.

Вот мой результат:

Шифротекст:

4c31cfb14b75d0ba0902f1c5fc243471dab7dca6e94fd89d07936b969bff63980311223bd62d9cf4d012235cf308e41c3c431f2e1ca78e3778341cc7ed21d2dd0f878187ff15d34fa42f8ede7c490ee3a18d81beed0599df1d4ad8619abef667ae5ba9cec776dc348e532e61f448c74883a2cd54c6f583ca3d10d01d2a2dd7bb682c8c2b579fec10a93772324e39db0afa09667b0b4b3631d033690b9868a32ccce7592bafb4280d46b3aa6ad44c0f51749fd7d7698944286342c9107690f90b0021d0d87ae831298f9f89dfc486b8f2d4ed36d901fa602a13fb7f9f7086fcd0f2da1ab23d65dc1cf87dd3eecff73a97d90ea16528d1a42f9d74bc7e2f742c80c2ba820f0195318eb680ffa7e69ca00a0c142f4edc05815412f58a9a5056a8620fc79e521c658d3865411baf1f41bfa88370124a400f36b4ae1dfa5e09036d22c9696c42faa7ec0020f9a9f417de42c04d60d92c941e7aa3f8f5aa305840de88a9b866e3b99966f556b45482c3c7b889db214fa642b395f61d64ddae03142742dc1e4c5300559bf9157af0c4ce3922d0f3843398a6ecbb2cb5eafd679f4ee814bfb7e3d675e16bc1c27cf8f97438454836a1ce806243da42292428f9e82e73eb5bcb55c45f55550cb0bce6b909bbd2f47fe2946c82148a12a4a28ed6d4fa435c6f6bd1cfa0961fd76ac3a23d7bfcfe3aad723e5898821ad4f6fb6a966b37e5343e028ceac0d562954ad7346d1d4ea04ed573feeeb3e4707e06f41777e7e77172caef4039b2c8a6f08e87f93a528d3591d3e90406a3bbf5ce4da651a129529c92c99da7c63d41b6ee645ebaa664950259f02f9e102a563d676cfc091371dd87321f3f99033399edb02631ddeb973801f1e310bbf4ca9a1aaec375a104baaddb3e0f0992b306a34db3505feb199c2e823f9e7f32cf42ea43d24dc494bd66e6bb9eca4f956a63195c17c7b6d1f345e4a0bcc50373d1d610fe143fa96046234832c62f58438242ac845fcbc00dccc121da6a902f53e467b7df936d3eed47da7548c92df0498d143db4a2a00cb1e8390b64a95f6f38c593b9e3e8587e88d1696ab52b71caa14d2d20fc7829b329c098ce87b576efdd761dd9e4a5d8fb0f1a6f9dab0bb28c5595fcb928215bc3e67695096de5c2107da3de17d49c436abc600eb58341

Открытый текст:

Cipherbox is what I consider to be a cryptographic swiss knife. The existence of this device wouldn't've been possible without a lot of open source code that I've found on the Internet and put together.

▍ Шаг 21: добавление учётной записи


Для добавления учётной записи выберите в меню “Login” и нажмите “1”. Далее введите название, имя пользователя, пароль и сайт. Для перехода к следующему окну нажмите “Enter”.



Больше фото










Как показали тесты, которые я провёл во время разработки предыдущих проектов, ESP32 может без проблем зашифровать/расшифровать запись длиной 700 символов. Так что технически вы можете вводить в каждое поле каждой категории 700 символов.

▍ Шаг 22: просмотр списка всех учётных записей


Для просмотра всех учётных записей выберите в меню “Login” и нажмите “5”. В результате отобразятся все названия с именами пользователей. Если все учётные записи на экран не входят, всегда можно открыть Serial Monitor и просмотреть их там.

Я добавил в список ещё одну запись.



▍ Шаг 23: просмотр учётной записи


Для просмотра учётной записи выберите в меню “Login” и нажмите “4”. Перед вами отобразятся все названия под номерами. Для просмотра отдельной записи введите её номер на клавиатуре и нажмите “Enter”.





Функция “Remove” работает в точности так же, как просмотр, но вызывается с помощью “2”.

▍ Шаг 24: редактирование учётной записи


Чтобы отредактировать учётную запись, выберите в меню “Login” и нажмите “2”, отобразятся все названия с номерами. Для изменения записи введите её номер и нажмите “Enter”. После этого введите новый пароль и снова нажмите “Enter” для сохранения. Для отмены используйте “Esc”.







▍ Шаг 25: отправка текста на ресивер


Cipherbox даёт возможность безопасно отправлять текст на расстояние до 200 метров.
Для отправки нажмите “Tab”, введите текст, который хотите передать и нажмите “Enter”. Мне удалось без проблем отправить сообщение из 84 символов. Полученный текст также отображается в Serial Monitor.





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

Я нахожу это самым слабым местом устройства, так что будьте осторожны.

▍ Шаг 26: поиск удачного применения Cipherbox




Больше фото




















Я постарался сделать Cipherbox максимально безопасным и полезным устройством.
Он содержит 6 алгоритмов шифрования (на деле их 14, если посчитать 3 режима AES у 4-х из них). Кроме того, он предоставляет хранилище, защищаемое паролем и четырьмя RFID-картами, а также вполне приемлемый графический интерфейс. Так что теперь решение о его применении за вами.

Tags:
Hubs:
Total votes 32: ↑23 and ↓9+30
Comments28

Articles

Information

Website
ruvds.com
Registered
Founded
Employees
11–30 employees
Location
Россия
Representative
ruvds