ДСТУ 4145

written on Thursday, May 15, 2014

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

http://i.imgur.com/x98bGrA.jpg

Шо такое эллиптические кривые?

Для начала краткий ликбез по поводу того, что же такое эллиптические кривые, зачем их придумали и как с этим жить. У мейнстримовых алгоритом шифрования есть два главных вража - паяльник и факторизация. Фактически, очень много всего, например RSA, держится на несколько наивном допущении, что можно взять два оче длинных простых (делящихся только на себя - 7, 19, 13) числа, умножит одно на другое, рассказать всему интернету результат, то при этом никто не догадается, какие именно числа умножали.

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

Но поскольку у математиков, кроме тяги к тому, чтобы все сломать, есть еще замечательная привычка придумывать абсолютно несвязанные с реальностью, но внутренне непротиворечивые абстракции, они придумали новый фокус. Если обычные числа уязвимы для факторизации, значит надо придумать какую-то особенную херню, которую можно умножать, складывать и брать модуль от деления по каким-то своим правилам. Ну и придумали, что можно нарисовать кривую, зафигачить на ней точки и складывать эти точки друг с другом. Оттуда уже вывели умножение и все остальное.

ДСТУ

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

Некоторая неприятность заключалась в том, что контейнер, в котором хранится это число вместе с параметрами выбранной кривой - зашифрованный блоб нестандартного вида. Блоб пришлось разламывать и получилась тулза для расшифровки контейнеров. В процессе расковыривания, заковыривания и програмирования тулзы - познакомился с крутой технологией emscripten. Работает вообще замечательно. Взял два файла из OpenSSL, скомпилировал с третьим, который сам написал и получил готовый кусок кода, который расшифровывает ключи прямо в браузере. По ходу дела - еще и с ASN.1 разобрался, давно на радаре мелкало.

Алгоритмы

На самом деле ДСТУ - это сразу несколько криптоалгоритмов:

  • Сначала мы берем свою специальную хеш-функцию ДСТУ-34.311-95 и с ее помощью делаем из пароля с солью ключ.
  • Если контейнер сделан на правильном стандарте, а не кустарном, то вместо хеш-функции используем MAC ГОСТ 28147
  • Потом берем блочный шифер ДСТУ 28147-89 и полученным ключем расшифровываем контейнер.
  • Уже из контейнера достаем заветное секретное число, которое используется, как приватный ключ для ДСТУ 4145-2002 чтобы сделать подпись

По сути первые два стандарта - это уже готовые и реализованные в OpenSSL и BounceCaste ГОСТы, только с другими S-BOX (таблицами замен).

Кто все эти люди?

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

Хеш-функция - это тоже все знают. Вася берет свой документ какого угодно размера, прогоняет через хеш-функцию и получает строчку фиксированной доины (32 байта, например).

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

Сертификат - это подписанный каким-то центральным авторити файлик, в котором указано мое имя и публичная часть ключа. Что-то типа личной печати, которая является еще и паспортом.

Что я сделал

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

Часть, которая умеет читать сертификаты, проверять их корректность и проверять соответствие подписи какому-то субъекту - этого все пока что только в патченом openssl.

Что получится в результате

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

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

This entry was tagged cryptofreak and ukraine