неділя, 19 квітня 2020 р.

Шифрування інформації

Вітаю усіх читачів мого блогу зі свтлим святом Воскресіння Христового! Христос воскрес!
За день до Великодня прийшла мені в голову ідея як можна шифрувати інформацію в БД для захисту персональних даних та іншої інформації, яка мала б лишатись конфіденційною і доступною лише для осіб, які мають право доступу до неї. Другими словами, навіть якщо зловмисник за допомогою будь-якого методу зможе отримати копію файла БД, це йому мало чим допоможе, оскільки вся потрібна інформація буде зашифрованою.
Ще під час проектування структури своєї БД я цікавився як засобами сервера БД можна забезпечити шифрування інформації. В принципі, Firebird підтримує шифрування БД за потреби, але реалізовується воно за допомогою сторонніх засобів за допомого написання спеціального плагіна, який прописується на сервері. Не буду вдаватись в технічні подробиці і переказувати документацію як такий плагін можна написати, оскільки кого цікавить зможе без проблем це нагуглити, зазначу лише, що в офіційній документації є приклад такого плагіна з використанням простого алгоритма шифрування XOR.
Спробую пояснити, що з себе представляє цей метод і наскільки він стійкий до підбору пароля або взлому. Спочатку розглянемо принцип XOR-шифрування  - як це працює. Взагалі, досить детально це описано в Вікіпедії, тому я лише зазначу, що ця операція є оборотною, тобто її можна застосовувати як для шифрування, так і для розшифрування інформації. На практиці, якщо:
 a XOR b = c, то:
 c XOR b = a
 c XOR a = b
По-простому, знаючи будь-які два значення з трьох, можна отримати третє.
Добре, зашифрувати і розшифрувати просто, якщо використовується один символ для всього блоку інформації. Стійкість до взлому майже ніяка, тому що зловмиснику достатньо методом перебору варіантів одного символу нескладно буде підібрати потрібний і розшифрувати інформацію.
Коли інформація шифрується за допомогою пароля довільної довжини, ситуація складніша -  кожен симфол інформації шифрується за допомогою відповідного йому символа з пароля, при цьому пароль повторяється стільки раз, скільки потрібно для досягнення довжини блоку інформації. В цьому випадку зловмиснику підібрати пароль для розшифровки буде набагато важче, але все ще можливо - на основі частотного аналізу входження символів в шифрований текст за наявності великого фрагменту шифрованого тексту можна пвдвбрати пароль і розшифрувати текст, хоча ця операція відносно тривала по часу. Такий алгоритм шифрування відносно стійкий, взламати пароль можливо лише для зашифрованого тексту.
Цей алгоритм застосовується в прикладі написання плагіна для шифрування наступним кодом:
  Move(src^, dst^, length);
  pxor(length, dst);
Для використання в реальних проектах такий метод шифрування не підходить, оскільки складність його все-таки дозволяє підібрати пароль і розшифрувати дані. Але за основу його взяти все-таки можна. Тому на основі цього алгоритму я вирішив розробити власний алгоритм, і мені це таки вдалося! Для цього алгоритму я придумав назву XORcerer (від англ. Sorcerer - чарівник).
Мій алгоритм використовує двопроходне XOR-шифрування на основі пароля довільної довжини з перетворенням байтів в їх шістнядцяткове текстове представлення. Кінцевий зашифрований файл буде представляти собою текстовий файл, в якому використані лише наступні символи: 0-9 та A-F. Ось так виглядає фрагмент зашифрованого файла:
160C07173F081D495A7803041F1835154953664B0256463733192A352D3F331740136330291
Після першого проходу ми отримуємо текстовий файл аналогічного виду, до яког приміняємо другий прохід і отримуємо повторно закодований файл в аналогічному представленні! Як до цього можна підібрати пароль для розшифровки - я просто не уявляю!
Для розшифровки використовується обернений метод - по 2 байти тексту перетворюється з текту в шістнадцятковий код символа, до якого і приміняється операція XOR, після цього те ж саме повторюється в другий прохід і в результаті ми отимуємо повністю розшифрований файл, який був спочатку! При цьому, якщо ввести хоч один символ пароля невірно, розшифрування відбудеться некоректно і навіть частини початкової інформації не вдасться відновити.
Для перевірки стійкості алгоритмуXORcerer до підбору пароля для розшифровки я спробував використати наступний підхід. Оскільки використовуються однобайтні коди символів, їх є всього 256 - від 0 до 255. Подвійним вкладеним циклом перебираються значення кодів символа, відбувається шифрування за допомогою мого алгоритма і перевіряється на відповідність результуючого символа. Якщо символи однакові, ймовірно, або перший, або другий з них входить у відповідно позицію в паролі. Проте підібрати правильний пароль для розшифровки в мене так і не вийшло, що свідчить про досить високу стійкість алгоритму до взлому. Єдиний недолік такого методу - збільшення в об'ємі інформації, оскільки для кожного байта вихідної інформації використовується два байта після кодування в представленні текстовим виглядом.
На даному етапі я реалізував роботу для шифрування лише текстових даних, надалі планую розвинути реалізацію алгоритму XORcerer у вигляді окремого класу з підтримкою потокового шифрування/розшифрування будь-яких даних з і стисненням шифрованих даних та розмістити сирці у вільному доступі.
Переглянути демонстрацію роботи алгоритму можна на цьому відео:

Немає коментарів:

Дописати коментар

Реставрація ну ду-у-уже староко комп'ютера. Чи можливе нове життя?

  Минулого року мені дістався дуже старий комп'ютер, якому понад 20 років. На відео я зробив перше включення і огляд нутрощів цього &quo...