Способы шифрования при создании эцп
Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста».
Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз.
Шифрование
Зачем нужно шифрование, все уже знают. PKI нам дает полезную плюшку: мы можем зашифровать один документ так, что расшифровать его смогут несколько получателей. Это очень удобно. Для этого нам нужно иметь сертификаты получателей.
Проверка подписи
Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще:
В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации):
- открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG;
- веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами.
Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала.
К счастью для нас, имеется свободная библиотека OpenPGP.js; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги):
Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка.
Вся работа по верификации подписей будет производиться подключенным скриптом validate.js :
Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку:
Электронная цифровая подпись сейчас на слуху — многие современные компании потихоньку переходят на электронный документооборот. Да и в повседневной жизни ты наверняка сталкивался с этой штукой. Если в двух словах, суть ЭЦП очень проста: есть удостоверяющий центр, есть генератор ключей, еще немного магии, и вуаля — все документы подписаны. Осталось разобраться, что же за магия позволяет цифровой подписи работать.
Сертификаты X.509
Так повелось, что основным «активом» в PKI является сертификат X.509. Сертификат — это что-то вроде паспорта, он содержит информацию, позволяющую идентифицировать субъект, которому выдан сертификат (поле Subject), указывает, кем он был выпущен (поле Issuer), серийный номер сертификата и многое другое. В Windows управлять сертификатами можно с помощью оснастки «Сертификаты» ( run->certmgr.msc ).
Менеджер сертификатов
Сертификаты хранятся в хранилищах («Личное», «Доверенные центры сертификации», «Доверенные лица». ).
Закрытый ключ для сертификата
Самое интересное о сертификате мы можем узнать на вкладке «Состав».
Состав сертификата
Обрати внимание на поля «Алгоритм подписи», «Алгоритм хеширования подписи» и «Открытый ключ». Если хочешь использовать сертификат для осуществления транзакций в России, во всех этих полях ты должен видеть слово «ГОСТ». Также следует обратить внимание на значение поля «Использование ключа» и поля «Действителен с» и «Действителен по»: первое позволит понять, возможно ли использование сертификата для выполнения нужной нам операции (шифрование, подпись), а второе и третье — возможно ли использовать данный сертификат в указанный момент времени. В дополнение к этому следует убедиться, что сертификат действителен. В этом нам поможет вкладка «Путь сертификации». Если с сертификатом все хорошо, мы увидим надпись: «Этот сертификат действителен».
Состояние сертификата
Как работает цифровая подпись
Если ты читал вторую часть нашего цикла, то помнишь, что существуют симметричный и асимметричный подходы к шифрованию. С электронной подписью дела обстоят очень похоже — есть подписи с симметричным механизмом, а есть с асимметричным.
Симметричный механизм подписи малоприменим на практике — никому не хочется генерировать ключи для каждой подписи заново. А как ты помнишь, именно в одинаковых ключах кроется фишка симметричной криптографии.
Схемы электронной подписи так же многообразны, как и способы шифрования. Чтобы схема подписи была стойкой, нужно, чтобы она основывалась на трудновычислимой математической задаче. Есть два типа таких задач: факторизация больших чисел и дискретное логарифмирование.
Подписание документа
Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате:
Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально.
Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую:
Цифровая подпись в Bitcoin
Помимо прочего, электронная подпись используется в криптовалютах, в частности — в Bitcoin. У каждого пользователя Bitcoin есть пара из секретного и открытого ключа. Хеш-значение открытого ключа служит основным адресом для передачи монет. Это значение не секретно, и сообщать его можно кому угодно. Но по значению хеша вычислить значение открытого ключа невозможно.
Сама пара ключей будет использована лишь однажды — при передаче прав собственности. На этом жизнь пары ключей заканчивается.
- PUB1 — публичный ключ;
- PRIV1 — секретный ключ;
- HASH1 или HASH(PUB1) — хеш-значение открытого ключа (биткойн-адрес);
- HASH2 или HASH(PUB2) — хеш открытого ключа следующего владельца.
Вот как устроен сам процесс передачи прав собственности на биткойны.
- Владелец монеты открыто сообщает хеш своего публичного ключа HASH(PUB1), это и будет идентифицировать биткойн.
- До момента продажи оба ключа PUB1, PRIV1 продавца остаются в секрете. Известен только HASH(PUB1) и соответствующий ему биткойн.
- Как только появляется покупатель, владелец формирует открытое письмо, в котором указывает адрес биткойна HASH(PUB1) и хеш-значение публичного ключа нового владельца HASH(PUB2). И конечно же, подписывает письмо своим секретным ключом PRIV1, прилагая публичный ключ PUB1.
- После этого пара ключей владельца PUB1 и PRIV1 теряют свою актуальность. Публичным ключом можно проверить само письмо, узнать новый адрес монеты.
О втором собственнике ничего не известно, кроме HASH(PUB2), до тех пор пока он не передаст права третьему владельцу. И эта цепочка может быть бесконечной.
Подписывая передачу прав с использованием ЭЦП, собственник подтверждает не только свою личность, но и свое согласие на проведение сделки. То есть вернуть монетку он уже не может и с этим согласился, подписавшись электронной подписью.
Благодаря HASH(PUB) получается двойная защита. Первая загадка — узнать публичный ключ по его хешу. Вторая загадка — подписаться чужим секретным ключом.
Такая технология построения цепи передачи прав и называется блокчейном. Благодаря этой технологии можно отследить историю владения до самых истоков, но изменить эту историю никак нельзя.
1. Генерация ключей
Причина стойкости RSA кроется в сложности факторизации больших чисел. Другими словами, перебором очень трудно подобрать такие простые числа, которые в произведении дают модуль n. Ключи генерируются одинаково для подписи и для шифрования.
Когда ключи сгенерированы, можно приступить к вычислению электронной подписи.
Цифровая подпись
Представь, дорогой читатель, что ты занимаешься некой очень ответственной работой. И результаты своей работы отправляешь в виде отчетов, от которых в конечном итоге зависят чьи-то конкретные судьбы и жизни. Получатели твоих отчетов принимают на их основе очень важные решения, и, если ты напортачишь, вполне можешь получить срок. Так вот, в таких ответственных организациях без электронной подписи никуда. Она позволяет тебе подписать тот самый суперважный секретный отчет своим сертификатом с закрытым ключом. Закрытый ключ, в идеале, может храниться на токене — специальном съемном устройстве, похожем на флешку, которое ты в редкие моменты достаешь из сейфа. Подпись гарантирует, что твой отчет отправлен именно тобой, а не уборщицей или сторожем. С другой стороны, ты не сможешь отказаться от авторства (это называется «неотрекаемость») и, если накосячишь в своем суперважном документе, на сторожа свалить вину не получится.
Электронная подпись применяется не только в спецслужбах и органах, но и в бизнесе. Например, для перевода пенсионных накоплений в НПФ: мы генерируем запрос на сертификат, отправляем его в удостоверяющий центр (УЦ). УЦ выпускает сертификат, мы подписываем сертификатом заявление на перевод пенсионных накоплений, отправляем — и вуаля. Подпись также позволяет осуществлять контроль целостности подписываемых данных. Если данные будут изменены, подпись не пройдет проверку.
Перед тем как заюзать наш сертификат, необходимо его проверить. Процедура включает в себя проверку цепочки сертификации, проверку срока действия и проверку, не отозван ли сертификат. Если мы подпишем файл недействительным сертификатом, подпись будет недействительной.
Мы проверили сертификат и убедились, что он в порядке. Переходим непосредственно к подписыванию данных. Подпись бывает двух видов: прикрепленная и открепленная.
Прикрепленная и открепленная подписи
Но, как обычно это бывает у Microsoft, стоит сделать маленький шаг в сторону, и розовый волшебный мир рушится
На C++ будет что-то вроде:
Подпись изнутри
ЭЦП на практике
В России, как и во многих развитых странах, электронная подпись имеет официальный юридический статус. У нас этот факт регламентирует закон № 63-ФЗ «Об электронной подписи». Однако он утверждает, что юридической силой обладает далеко не любая электронная подпись, а только соответствующая определенным критериям:
- подпись сгенерирована посредством криптографического преобразования с секретным ключом;
- этот ключ и соответствующий ему открытый ключ выданы квалифицированным удостоверяющим центром;
- по подписи можно достоверно установить ее обладателя.
Подпись также должна быть вычислена средствами, соответствующими требованиям закона. Этим требованиям удовлетворяет отечественный алгоритм шифрования ГОСТ 34.10—2012. Он использует математический аппарат эллиптических кривых, является достаточно стойким и официально используется для разработки криптографических средств, реализующих электронную подпись. Для того чтобы попробовать неквалифицированную подпись — без сертификата удостоверяющего центра, можно воспользоваться известной PGP. Потестировать подпись можно, к примеру, на сайте ReadVerify.
Стоит сказать, что в нашей стране электронная подпись используется чаще, чем можно себе представить. В банках, налоговых, торгово-закупочных операциях, бухгалтерии — во всех этих организациях используется или внедряется ЭЦП. Электронная подпись отважно борется со злом бюрократии, однако до полной победы еще далеко.
За рубежом электронный документооборот процветает еще дольше. Официальный стандарт электронной подписи в США DSS (Digital Signature Standard) также использует эллиптические кривые и основан на описанной выше схеме Эль-Гамаля.
3. Проверка электронной подписи
RSA, как известно, собирается уходить на пенсию, потому что вычислительные мощности растут не по дням, а по часам. Недалек тот день, когда 1024-битный ключ RSA можно будет подобрать за считаные минуты. Впрочем, о квантовых компьютерах мы поговорим в следующий раз.
В общем, не стоит полагаться на стойкость этой схемы подписи RSA, особенно с такими «криптостойкими» ключами, как в нашем примере.
Расшифрование
Что такое электронная подпись
Все термины и определения приведены в законе, поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок.
Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова.
Электронная подпись бывает простая и усиленная. Простая подпись не предполагает использование стандартных криптографических алгоритмов; все способы аутентификации (установления авторства), которые были придуманы до эпохи ЭЦП — это по сути и есть простая электронная подпись. Если вы, например, зарегистрировались на сайте госуслуг, удостоверили свою личность путем явки в многофункциональный центр, а затем направляете через этот сайт обращения в различные государственные органы, то ваши логин и пароль от сайта госуслуг и будут в данном случае вашей простой электронной подписью.
Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации.
Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа. Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно.
Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку.
Ситуация кардинально меняется, если изобретен замок с двумя ключами: один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал.
Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш.
Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки.
Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа:
- изготавливает его хэш с помощью стандартного алгоритма;
- расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича;
- убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля!
Всё, казалось бы, хорошо, но есть одно большое «но». Предположим, что некий злодей по фамилии Плохиш решил прикинуться Ивановым и рассылать документы от его имени. Ничто не мешает Плохишу сгенерировать два ключа, изготовить с помощью секретного ключа электронную подпись документа и послать это всё получателю, назвавшись Ивановым. Именно поэтому описанная выше ЭЦП называется усиленной неквалифицированной: невозможно достоверно установить, кому принадлежит открытый ключ. Его с одинаковым успехом мог сгенерировать как Иванов, так и Плохиш.
Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр).
Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр, который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова.
Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн.
Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру.
Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать.
2. Проверка подписи
Даже если не вникать в схему, понятно, что такой алгоритм сложнее. Кроме того, нигде уже не используется простой модуль, его сменили эллиптические кривые. Эллиптическая кривая — это кривая, которая задана кубическим уравнением и имеет невообразимо сложное представление. Задача решения логарифма в группе точек, которые принадлежат эллиптической кривой, вычислительно сложная, и на данный момент не существует таких мощностей, которые решали бы это уравнение за полиномиальное время, если длина секретного ключа составляет 512 бит. Согласно задаче дискретного логарифмирования, невероятно сложно найти на кривой две такие точки, которые связывает операция возведения в некоторую степень.
Заключение
Как видишь, работа с PKI достаточно сложная и требует серьезной подготовки, выдержки и терпения. Перед тем как бросаться реализовывать классные фичи, крайне важно понимать основные концепции PKI.
За кадром остались поточное шифрование и расшифрование, подпись несколькими сертификатами, генерация запросов на сертификат и многое другое, но основу я тебе показал. Код примеров с тестами можно скачать на GitHub.
Для обеспечения конфиденциальности и достоверности информации, передаваемой через интернет, используются шифрование и цифровые подписи, то-есть — криптография.
Криптогра́фия (от др.-греч. κρυπτός — скрытый и γράφω — пишу) — наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.
wikipedia
Алгоритмы шифрования делятся на симметричные (с секретным, единым ключом, одноключевые) и асимметричные (с открытым ключом).
Симметричные алгоритмы шифрования (или криптография с секретными ключами) основаны на том, что отправитель и получатель информации используют один и тот же ключ. Этот ключ должен храниться в тайне и передаваться способом, исключающим его перехват. Если ключ не был скомпрометирован, то при расшифровке автоматически выполняется аутентификация отправителя, так как только отправитель имеет ключ, с помощью которого можно зашифровать информацию, и только получатель имеет ключ, с помощью которого можно расшифровать информацию.
Так как отправитель и получатель — единственные пользователи, которые знают этот симметричный ключ, при компрометации ключа будет скомпрометировано только взаимодействие этих двух пользователей. Безопасность систем шифрования такого типа зависит от конфиденциальности ключа, используемого в алгоритме шифрования, а не от хранения в тайне самого алгоритма.
В асимметричных алгоритмах шифрования (или криптографии с открытым ключом) используются два ключа — открытый ключ (public key) и секретный ключ (secret key или private key), сгенерированные таким образом, что их последовательное применение к некоторому информационному объекту оставляет этот объект без изменений.
Эти ключи различны и не могут быть получены один из другого, хотя и создаются вместе. При шифровании используется только открытый ключ, при дешифровании — только секретный ключ.
Дешифрование кода без знания секретного ключа практически неосуществимо. В частности, практически неразрешима задача вычисления секретного ключа по известному открытому ключу.
Основное преимущество криптографии с открытым ключом — упрощенный механизм обмена ключами. При осуществлении коммуникации по каналу связи передается только открытый ключ, что делает возможным использование для этой цели обычного канала и устраняет потребность в специальном защищенном канале для передачи ключа.
В отличие от асимметричных алгоритмов шифрования, в которых шифрование производится с помощью открытого ключа, а расшифровка — с помощью закрытого, в схемах цифровой подписи подписание производится с применением закрытого ключа, а проверка подписи — с применением открытого. То-есть всё наоборот!
Закрытый ключ является наиболее уязвимым компонентом всех криптосистем шифрования с открытым ключом и цифровой подписи. Злоумышленник, укравший закрытый ключ пользователя, может создать действительную цифровую подпись любого электронного документа от лица этого пользователя. Поэтому особое внимание нужно уделять способу хранения закрытого ключа.
В среде криптосистем с открытым ключом критически важно, чтобы вы были абсолютно уверены, что открытый ключ, которым собираетесь что-то зашифровать – не искусная имитация, а истинная собственность вашего корреспондента. Можно попросту шифровать только теми ключами, которые были переданы вам их владельцами из рук в руки на дискетах. Но предположим, что нужно связаться с человеком, живущим на другом краю света, с которым вы даже незнакомы; как вы можете быть уверены, что получили его подлинный ключ?
Цифровые сертификаты ключей упрощают задачу определения принадлежности открытых ключей предполагаемым владельцам.
Цифровой сертификат ключа – это информация, прикреплённая к открытому ключу пользователя, помогающая другим установить, является ли ключ подлинным и верным. Цифровые сертификаты нужны для того, чтобы сделать невозможной попытку выдать ключ одного человека за ключ другого.
Подробно с математической точки зрения и программной реализации понятия шифрования и электронно-цифровой подписи рассматриваются в рамках криптографической науки. Но в настоящее время основные из них должен знать любой специалист в области информации и информационных технологий.
Криптография – комплексная наука о защите информации. Это могут быть конфиденциальные документы (договора, соглашения, номер банковского счета и др.), деловая и личная переписка. Безопасность передаваемых данных обеспечивается за счет шифрования данных и их электронной цифровой подписи.
Использование криптографических методов и алгоритмов необходимо для безопасной передачи информации по открытым каналам связи (например, Интернет) таким образом, чтобы она была недоступна никому, кроме того лица, для кого она предназначена. Это достигается благодаря использованию шифрования и подписи документов или файлов при помощи ключевой пары.
Ключевая пара – открытый и закрытый ключи, которые используются для шифрования данных.
В современной криптографии криптографические системы подразделяются на два класса в зависимости от количества используемых ключей:
· симметричные криптосистемы (одноключевые);
· асимметричные криптосистемы (двухключевые).
Ключи, используемые в одноключевых и двухключевых криптосистемах, называются, соответственно, симметричными и асимметричными.
В симметричных криптосистемах пользователь использует один и тот же закрытый ключ как для шифрования, так и для расшифрования данных. Достоинством подобных систем является большая скорость при передаче данных, а недостатком – сложность безопасной и надежной передачи закрытого ключа на сторону получателя зашифрованной информации.
В асимметричных криптосистемах у каждого пользователя есть два ключа – открытый и закрытый (секретный). Один из них используется для шифрования, а другой – для расшифрования информации. Если шифрование осуществляется с помощью открытого ключа, то расшифрование должно осуществляться с помощью парного ему закрытого.
Закрытый и открытый ключи определенным образом связаны между собой и
генерируются одновременно. Закрытый ключ пользователя доступен только самому владельцу и хранится в тайне, а открытый ключ может распространяться свободно и известен всем лицам, с кем владелец поддерживает обмен защищенной информацией.
Информационная безопасность ассиметричных криптосистем основывается на том, что знание открытого ключа не позволяет по нему определить парный закрытый ключ.
Основное применение ассиметричных криптосистем – создание/проверка электронной цифровой подписи и асимметричное шифрование.
Шифрование – это преобразование данных в вид, недоступный для чтения без соответствующей информации (ключа шифрования). Задача состоит в том, чтобы обеспечить конфиденциальность, скрыв информацию от лиц, которым она не предназначена, даже если они имеют доступ к зашифрованным данным.
Шифрование информации гарантирует вам:
· недоступность информации для сторонних лиц;
· подлинность информации (информации поступит в неискаженном виде);
· целостность информации (данные, которые вы хотите передать останутся целыми в процессе передачи).
В общем случае шифрование состоит из следующих этапов (рис. 5.9):
Рис. 5.9 Шифрование данных
1) вы зашифровываете данные (открытый текст) с помощью своего закрытого ключа и открытого ключа вашего партнера. Открытый ключ партнера вы получаете у него самого или в общедоступной базе данных, в которой хранятся открытые ключи пользователей;
2) после этого вы отправляете зашифрованные данные партнеру;
3) ваш партнер получает зашифрованные данные. С помощью своего закрытого ключа и вашего открытого он расшифровывает данные. В результате ваш партнер получает тот самый открытый текст (конфиденциальные данные) который вы зашифровали.
Одним из самых распространенных алгоритмов шифрования является алгоритм RSA, длина ключа которого обычно 1024 бита. Принцип работы этого алгоритма достаточно простой. Каждый участник криптосистемы генерирует два случайно больших простых числа p и q, выбирает число e, меньшее pq и не имеющее общего делителя с (p-1)(q-1), и число d, такое, что (ed-1) делится на (p-1)(q-1). Затем он вычисляет n = pq, а p и q уничтожает. Пара (n,e) называется открытым ключом, а пара (n,d) – закрытым ключом.
Открытый ключ передается всем остальным участникам криптосистемы (обычно это означает, что клиент должен прийти в офис банка для заверения открытого ключа), а закрытый сохраняется в тайне.
c: = m e (mod n),
а участник Б «расшифровывает» его с помощью своего закрытого ключа:
m: = c d (mod n).
Электронно-цифровая подпись решает несколько иную задачу, чем шифрование. С ее помощью обеспечивается доверие к передаваемой информации, гарантируется авторство и целостность данных.
Электронно-цифровая подпись (ЭЦП) – это последовательность байтов, формируемая путем преобразования подписываемого электронного документа специальным программным средством по криптографическому алгоритму и предназначенная для проверки авторства электронного документа.
Электронно-цифровая подпись является подтверждением подлинности, целостности и авторства электронного документа.
При соблюдении правовых условий использования ЭЦП в электронном документе она признается равнозначной собственноручной подписи в документе на бумажном носителе. Правовыми основами использования ЭЦП в системах электронного документооборота являются главы Гражданского кодекса Российской Федерации, федеральные законы (ФЗ) РФ «Об информации, информатизации и защите информации» № 24-ФЗ от 20 февраля 1995 г. и «Об электронной цифровой подписи» №
1-ФЗ от 10 января 2002 г.
s = m d (mod n),
mп = s e (mod n).
Рис. 5.10 Работа с электронно-цифровой подписью
Обычно первоначальный обмен ключами между клиентом и банком осуществляется на магнитных носителях без передачи ключей через открытые компьютерные сети. Для осуществления всех операций с электронно-цифровой подписью на компьютер клиента устанавливается программное обеспечение, которое предоставляет банк. Все необходимые данные для клиента (открытый, закрытый ключ, идентификационные данные и прочие) обычно хранятся на отдельной дискете или в специальном аппаратном устройстве, которое подключается к компьютеру клиента.
Перед непосредственным созданием ЭЦП (см. рис. 5.10) на документе происходит процесс хэширования с помощью специальной хэш-функции. Представленная на рис. 5.10 процедура соответствует, например, стандарту ГОСТ Р 34.10-94.
При проверке подписи проверяющий должен быть абсолютно уверен в подлинности открытого ключа. То есть в том, что имеющийся у него открытый ключ принадлежит конкретному пользователю. Для заверения принадлежности открытого ключа конкретному пользователю используется сертификат открытого ключа, подписанный третьей доверенной стороной – Удостоверяющим Центром.
Сертификат – электронный документ, включающий открытый ключ и информацию о владельце данного ключа, заверенную с помощью ЭЦП Удостоверяющим Центром.
Сертификат предназначен для:
· подтверждения подлинности ЭЦП и идентификации ее автора;
· обеспечения возможности шифрования электронных документов, направляемых владельцу сертификата;
· аутентификации владельца при установлении защищенных соединений по TLS/SSL протоколам.
Сертификат представляет собой информационный блок данных, формат которого включает следующую информацию (в соответствии с положениями международной Рекомендации ITU-T Х.509):
· номер версии сертификата;
· серийный номер сертификата;
· идентификатор алгоритма, используемого для подписи удостоверяющего центра;
· сведения об издателе сертификата (УЦ);
· период действия сертификата: начало и конец периода;
· сведения о владельце сертификата, однозначно идентифицирующие его в рамках данной системы;
· информацию об открытом ключе пользователя: идентификатор алгоритма и собственно открытый ключ;
· дополнительные атрибуты, определяемые требованиями использования сертификата в системе;
· ЭЦП Удостоверяющего Центра.
Срочно?
Закажи у профессионала, через форму заявки
8 (800) 100-77-13 с 7.00 до 22.00
1. Генерация подписи
Генерирование открытого и секретного ключей
Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key).
Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win. Ниже будет описана работа из-под Линукса.
Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root'а) команду
В процессе генерирования вам будет предложено ответить на ряд вопросов:
- тип ключей можно оставить «RSA и RSA (по умолчанию)»;
- длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит;
- в качестве срока действия ключа для личного использования можно выбрать «не ограничен»;
- в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать;
- в качестве примечания можно указать город, либо иную дополнительную информацию.
После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет.
Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат:
Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим.
Roadmap
Это пятый урок из цикла «Погружение в крипту». Все уроки цикла в хронологическом порядке:
-
Основы и исторические шифраторы. Как работают (и анализируются) шифры сдвига, замены, Рихарда Зорге, шифр Вернама и шифровальные машины Что это такое, как выполняется распределение ключей и как выбрать криптостойкий ключ Что такое сеть Фейстеля и какими бывают отечественные блочные шифры, используемые в современных протоколах, — ГОСТ 28147—89, «Кузнечик» В чем разница между 3DES, AES, Blowfish, IDEA, Threefish от Брюса Шнайера и как они работают
- Урок 5. Электронная подпись. Виды электронных подписей, как они работают и как их использовать (ты здесь)
- Урок 6. Квантовая криптография. Что это такое, где используется и как помогает в распределении секретных ключей, генерации случайных чисел и электронной подписи
Картина мира
Перед погружением в код давай разберем немного терминологии. PKI — инфраструктура открытых ключей. Как несложно догадаться, PKI основана на асимметричном шифровании. В симметричных шифрах для шифрования и расшифрования используется один ключ. В асимметричных для шифрования используется один ключ, а для расшифрования — другой. Вместе они образуют ключевую пару.
Информация, необходимая для работы PKI, содержится в сертификате X.509. В PKI участвуют как минимум три стороны: Алиса, Боб и удостоверяющий центр (УЦ). У Алисы и Боба есть сертификаты с закрытым ключом, подписанные так называемым корневым сертификатом УЦ. У Алисы есть сертификат Боба с открытым ключом, а у Боба — сертификат Алисы с открытым ключом. Алиса и Боб доверяют УЦ и благодаря этому могут доверять друг другу.
Упрощенная структура PKI
Другие статьи в выпуске:
WARNING
Приведенный ниже код предназначен исключительно для ознакомления с PKI. Не следует без оглядки использовать его в реальной работе.
Факторизация больших чисел
Рассмотрим на практике электронную подпись на основе знаменитого алгоритма RSA. Шифрование RSA мы рассматривать не стали — это мейнстрим, и в той же «Википедии» есть его подробное описание.
2. Вычисление электронной подписи
Дискретное логарифмирование
Это вторая сложная проблема, на которой основаны цифровые подписи. Для начала хорошо бы усвоить, что такое дискретный логарифм. Для кого-то такое словосочетание может звучать пугающе, но на самом деле это одна из самых простых для понимания вещей в этой статье.
Предположим, дано уравнение 4x = 13 (mod 15) . Задача нахождения x и есть задача дискретного логарифмирования. Почему же она так сложна для вычисления? Попробуй решить это уравнение перебором! Компьютер, ясное дело, будет более успешен, но и задачи дискретного логарифмирования обычно далеко не так просты. Возьмем для примера схему Эль-Гамаля.
Проверка подписи и декодирование
А теперь, дорогой читатель, представь, что ты большой начальник и должен принять важное стратегическое решение на основе отчета, который тебе прислал сотрудник по электронной почте. Для твоего удобства отчет был подписан открепленной подписью. Открыв почту и скачав отчет, ты, как опытный, знающий жизнь человек, не спешишь принимать на веру содержимое отчета и проверяешь подпись. После проверки выясняешь, что подпись неверна — не сошлась контрольная сумма. В результате оповещаешь службу безопасности, которая проводит расследование и выясняет, что хитрые конкуренты взломали почтовый сервер и отправили тебе фальшивый документ. Тебя наградили за бдительность, конкурентов посадили, а компания наконец-то получила оригинальный отчет с проверенной электронной подписью.
Если пользователь прислал тебе отчет в виде прикрепленной подписи, тебе для чтения придется его декодировать:
Выводы
Будущее неразрывно связано с криптографией. В один прекрасный момент при получении паспорта наши дети будут генерировать электронную подпись и покупать чипсы в ларьке за криптовалюту. Что готовит нам будущее с точки зрения развития криптографии, посмотрим в следующей статье на примере квантовых компьютеров.
Читайте также: