written on Thursday, May 15, 2014
Поки у нас тут триває війна з русо-фашисто, рух криптонепротивлення не збирається згортати манатки. Цього разу я вирішив взятися за цифровий підпис та еліптичні криві. Криптографією та Правим Сектором можна досягти навіть більшого, ніж просто Правим Сектором. Редакція бложика просить перед читанням цього тексту прибрати від екрану москалів, математиків та людей, у яких бомбить від слів "ГЕШ ФУНКЦІЯ " та "БЛОЧНИЙ ШИФЕР ".

Для початку — короткий лікбез про те, що ж таке еліптичні криві, навіщо їх придумали і як з цим жити. У мейнстрімових алгоритмів шифрування є два головні вражи — паяльник і факторизація. Фактично, дуже багато всього, наприклад RSA, тримається на дещо наївному допущенні, що можна взяти два очі довгих простих (які діляться тільки на себе — 7, 19, 13) числа, перемножити одне на друге, розказати всьому інтернету результат, і при цьому ніхто не здогадається, які саме числа перемножували.
Якщо хтось може здогадатися, а добрі дядьки-математики сплять, щоб зробити таку бяку, то всі приватні ключі раптом стають доступними для всіх, і замість криптоанархії ми отримуємо криптоапокаліпсис.
Але оскільки у математиків, крім тяги до того, щоб все зламати, є ще чудова звичка придумувати абсолютно відірвані від реальності, але внутрішньо несуперечливі абстракції, вони придумали новий фокус. Якщо звичайні числа вразливі до факторизації, значить треба придумати якусь особливу хуйню, яку можна множити, додавати і брати модуль від ділення за якимись своїми правилами. Ну і придумали, що можна намалювати криву, зафігачити на ній точки і додавати ці точки одна до одної. Звідти вже вивели множення і все інше.
Я зайнявся тим, що взяв свої ключі, видані в податковій, і почав колупати їхній формат. Власне, ключем є одне 256-бітне число. Крім нього є ще параметри рівняння, які задають криву, координати базової точки та розмір поля. Всі ці параметри стандарти, і їхні варіації дані в табличках державного стандарту.
Деяка неприємність полягала в тому, що контейнер, у якому зберігається це число разом із параметрами обраної кривої — це зашифрований блоб нестандартного виду. Блоб довелося розламувати і вийшла тулза для розшифровки контейнерів. У процесі расковування, заковування і програмування тулзи познайомився з крутою технологією emscripten. Працює взагалі замечательно. Взяв два файли з OpenSSL, скомпілював із третім, який сам написав, і отримав готовий шматок коду, який розшифровує ключі прямо в браузері. По ходу діла — ще й з ASN.1 розібрався, давно на радарі мелькало.
Насправді ДСТУ — це одразу кілька криптоалгоритмів:
По суті перші два стандарти — це вже готові і реалізовані в OpenSSL і BounceCaste ГОСТи, тільки з іншими S-BOX (таблицями замін).
Блочний шифер — це штука дуже проста. Є двоє Васів, у кожного з яких є однакова секретна стрічка. Потім перший Вася пише якийсь документ, шифрує блочним шифером і отримує документ такого самого розміру, але зашифрований. Далі другий Вася може таким самим ключем розшифрувати цей документ.
Хеш-функція — це теж всі знають. Вася бере свій документ якого завгодно розміру, проганяє через хеш-функцію і отримує стрічку фіксованої довжини (32 байти, наприклад).
А ось останній крок — це вже для підпису і асиметричного шифрування. Отримуємо пару циферок — одну залишаємо собі, другу роздаємо всім. Ну і тією, яку залишили собі — підписуємо що треба, а всі хто знають другу (публічну) можуть точно дізнатися, що людина яка поставила підпис знає перше число.
Сертифікат — це підписаний якимось центральним авториті файлик, у якому вказано моє ім'я і публічна частина ключа. Щось типу особистої печатки, яка є ще й паспортом.
Поки що я навчився читати параметри із запароленого контейнера і зробив собі на пайтоні код, який може, знаючи ці параметри, згенерувати підпис до потрібного файлу, перевірити її або згенеріти нову пару ключів. Це ні разу не повноцінний PKI звісно. Подивитися можна тут
Частина, яка вміє читати сертифікати, перевіряти їхню коректність і перевіряти відповідність підпису якомусь суб'єкту — цього все поки що тільки в патченому openssl.
В результаті буде бібліотека для браузера і консольна тулза для перевірки і посвідчення власної автентичності. Зараз це роблять дуже стрьомно — через підгрузку жава-апплета, що мене дико бісить.
Найкраще — такий підпис засвідчується державою і нею ж признається. В теорії можна буде натискати в браузері кнопочку замість автографів на бумажках, але це питання впровадження, документообігу і всього такого аж до голосування на виборах.