Создание ЭЦП в отдельном файле. Криптография

в 13:00, , рубрики: криптография, эцп, метки: ,

Предисловие

О себе

Учусь в колледже, познакомился с программированием около года назад, на работу не берут в таком возрасте в офисы — всем нужны дипломы, квалификации и опыт работы (на стажировки в крутые компании тоже берут только с 3-5 курса университета), поэтому решил подзаработать на фрилансе.

Кому, Зачем

При выполнении проекта не нашел на хабре ничего подобного. Думаю краткий мануал по созданию ЭЦП на C# не будет лишним, но т.к. много материала есть в интернет (большинство на C++) текст будет писаться ориентировочно для ознакомительных целей и расширения знаний начинающих C#'перов о криптографии.

Краткое введение

Что такое ЭЦП

Электронная подпись (ЭП) — информация в электронной форме, присоединенная к другой информации в электронной форме (электронный документ) или иным образом связанная с такой информацией. Используется для определения лица, подписавшего информацию (электронный документ) © wiki

Вообщем-то ЭЦП это закодированная информация, чаще всего присоединенная к файлу.

Механизм создания ЭЦП

image

Опишу алгоритм на рисунке:

  1. Переводим файл в байты.
  2. Добавляем к нему закрытый ключ.
  3. Производим хеширование. Самые распространенные алгоритмы: MD5 и SHA1.
    Получается зашифрованная подпись.
  4. Добавляем подпись в конец файла.

Хэш (hash) — т.н. Контрольная сумма.
Такой алгоритм создания подписи называется ассиметричным шифрованием.
Также существует симметричное шифрования. В симметричном шифровании есть всего 1 ключ.Он шифрует и расшифровывает. В ассиметричном шифровании существует два ключа — закрытый и открытый. Оба ключа — равносильны, любой из них выбирается закрытым — сохраняется на внешний носитель, а второй отдается в открытый доступ. Открытый ключ закрепляют в сертификаты, т.н. оболочки для ключей, вместе с ключом там располагается информация о владельце.

Где используется ЭЦП

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

MIME формат

Сам я использовал MIME формат, поэтому расскажу о нём.
Сам изучал по этому сайту (не сочтите за рекламу) MIME format.
Достаточно ясно разъясняется, почему удобно использовать этот формат при работе с e-mail.
Я работал с используемой на данный момент версией S/MIME.

Создание подписи

Классы C#

1.Неудобные:
В целом все классы используют CryptoAPI, но в .NET с этим много проблем, куча неоднозначных ошибок, некоторые методы вообще не работают
RSACryptoServiceProvider и DSACryptoServiceProvider — вот эти ребята
В этих класса не настроена реализация PKCS #7 — формат зашифрованных и подписанных сообщений .p7s (я сохранял подпись в формате .sgn, как это делают многие программы, но работающая подпись, сохраненная в отдельный файл, при переименовании в .p7s должна открыть сертификат, которым подписана на вашем компьютере)
2.Удобные:
Гораздо легче обстояла работа с классами SignedCMS и ему похожими которые находятся в System.Security.Cryptography.Pkcs, благо они ориентированы на создание этих подписей.
Эта тема очень обширна. Насчет Pkcs — на MSDN есть отличный мануал по созданию подписей, валидации, поиску их на компьютере.

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

Автор: kLkA

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js