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

dtyf2zz2kgjtgnk_rmupldtew4m.png


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

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

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

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

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

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


▍ Компоненты


eakl5udpznjix-qithwa1m8-qpc.png

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

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


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

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


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


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

dm7-ydqzr1aoom7bkidoxdp4slo.png

Больше фото


Согласно определению 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


-n38fwmypthiqj5b4nzl_l_ffko.png

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

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


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

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

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


7hfc2o6n24kwh6xuxcknpoebyya.png

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

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

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


8ssaukuy4r4qmyrhfsrmtrjd1xe.png

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

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

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

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


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

gffpwyzresolhfyeuxscunkelr0.png

Лучше всего генерировать случайные ключи с помощью броска 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-адреса ресивера


ege9ma2_qbbn5znobwp6umm_68s.png

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

#include 

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

}


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

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

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


fv3zrxr2qks4mt-xzbb8wijwv9a.png

Откройте файлы 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.

9zrtgooauklsvdn-jczuy46zn_a.png

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


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

cg0s3adrvifiu2z4psxyvmf6l-m.png

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


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

h__7yta08qf4ni6yml8jfq9rxsw.png

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


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

pr46c9-ugtwkcebubo7t6vpa0vw.png

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


lwzwifqzr67cwqkd8rybfpfz1gm.png

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


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

fbms8gxlw8kcqervsqhbymlptbk.png

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


ff-9uog01ayswbcpkvqizu5qotq.png

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


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

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


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


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

fwe94ttlcllzili8huys0srma4c.png

qmjr8xiciti1ab0wbb2hsnw6dme.png

uuewojzeyq3b5dwsao5pdphaqna.png

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

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

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

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

Для пароля 1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./LKJHGFDSA?> я получил верификационный номер 6117.

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

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


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


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

v-ld4-gduwqqfek15bybjrpxoio.png

zinjx4o2nizyb5qfnsasibthwiy.png

wbztbkrjo95ie9acdgyegz3he9q.png

Для шифрования текста выберите в меню нужный алгоритм и нажмите на клавиатуре »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: расшифровка текста


ssicukpyzdcadlcgoqqzgx1s-60.png

Откройте 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».

9eudk87v0v3cjoqj6rgqvzvomkg.png

Больше фото


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

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


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

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

8znzdv-lruihw56lq6q0pdbndve.png

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


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

2jjk-qvydkibk0npyjx5wbxc1xo.png

7itglgcyzlcswjp6fqnttc5439e.png

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

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


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

jir8wqdrkflzgpbmt3lt1ebcy4o.png

j44lfqiea01rrn5a4y8kdgrevrk.png

n4zrgrkrswivuwi0gf9x8hhmvuq.png

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


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

owaaknoogics2-jtkfmnontsklq.png

ojxvb-coi_lovnmvql1kyutp9w8.png

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


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

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


ymjsufe_jc4ahrm1xoyoewzwk9c.png

Больше фото


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

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru