Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Написание программы для проверки электронной подписи

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Написание программы для проверки электронной подписи
Имя
Сообщение << Старые топики   Новые топики >>
Написание программы для проверки электронной подписи - 2010-02-08 19:30:37.043333   
Ustyugova

Сообщений: 3
Оценки: 0
Присоединился: 2010-02-08 19:21:17.780000
Есть такая задача: дана либо смарт-карта, либо просто хранилище, из него берется закрытый ключ шифрования, есть еще документ в который встроен открытый ключ, есть программа которая должна дать ответ: принадлежит ли данный документ, человеку который имеет закрытый ключ. Вообщем нужно написать такую программа на c#, скажите пожалуйста с чего начать, что почитать по этой теме. И как вообще подобраться к этой задаче
Post #: 1
RE: Написание программы для проверки электронной подписи - 2010-02-08 19:35:36.470000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Гугел, C# + Cryptography
Post #: 2
RE: Написание программы для проверки электронной подписи - 2010-02-08 20:22:45.436666   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
На C# тебе понабодится
Capicom SDK - ищи его на microsoft.com (в Windows XP, Vista, 7-ке Capicom.dll по умолчанию отсутствует)
Далее в C# подключаешь namespace Criptography.
И с его помощью моешь поставить ЭЦП на любой документ.
Как делается ЭЦП
1. С документа снимается хеш, например SHA256 (снимается просто как с огромной строки).
2. Хеш шифруется закрытым ключом.
3. Зашифрованный хеш подкрепляется сигнатурой открытого ключа и вот эта связка "хеш"+"открытый ключ" называется ЭЦП.
Для проверки достоверности подписи делают так:
Так как шифрование в открытом/закрытом ключе асимметичное. То
1. Берётся текущее тело документа и с него снимается хеш - SHA256.
2. Из ЭЦП берётся зашифрованный хеш и ключ и хеш расшифровывается - получаем тот хеш который был на момент подписания.
3. Сравнивается расшифрованный и текущий хеши.
Если хеши совпадают то с момента подписания ни один байт документа не изменился => подпись не нарушена.
Если хеши не совпали то документ посе подписания был изменён => подпись нарушена.

Если задача узкая - т.е. ставить подписи нужно только на документ Microsoft Word/Excel, то это можно сделать используя объектную модель Word/Excel. Например, открой сейчас свой текстовый процессор Word или OpenOfice Writer.
Open Office Writer: выбери в меню "Файл/Цифровые подписи" и всё - можешь ставить ЭЦП на документ используя уставновленные на компьютере ключи (закрытые, которые в свойствах имеют возможность подписания).
Microsoft Word (2003): Сервис -> Параметры -> (вкладка) Безопасность -> (кнопка) Цифровые подписи.
Всё это можно сделать на чистой объектной модели не залезая в Capicom SDK (я так думаю, сам через ОМ не пробовал подписывать, но наверно можно).

По термонологии. Обычно под открытым ключом понимают ключ, которым шифруют, а под закрытым - ключ которым расшифровывают. Так например происходит при шифровании почты. Человек выставляет открытый ключ всем и говорит - будете отправлять мне письма шифруйте их этим ключом. А я имея секретный закрытый ключ расшифрую их.

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

По поводу устройств хранения закрытого ключа - E-token, Smart-карта, …. они для программиста почти ничего не значат благодаря удобному интерфейсу. Когда ты вставляешь брелок E-token в USB-порт, закрытый ключ с него сам переходит в "личное хранилище" и таким образом становится доступным прикладным программам. Тоже самое и со смарт-картами. То есть и драйвера сами достают ключи - тебе поэтому нет разницы как этот ключ попал в хранилище - бери его, шифруй им и забывай о его существовании.

По "хранилищам" они условно делятся на "хранилища текущего пользователя" и "хранилища системы". Те ключи (закрытые ключи) и сертификаты (открытые ключи) что лежат в "хранилища системы" доступны всем учётным записям. А те ключи и сертификаты что лежат в "хранилище текущего пользователя" доступны только ему.
Если просто создать файл с расширением CER или PFX, вызвать на нём контекстное меню и выбрать "Установить" или "Импортировать" то установка произойдет в хранилище только текущего пользователя. Учитывай это. Если "администратор" установил сертификат то "бухгалтер" и "Local System" его не увидят. Но это уже тонкости - запускай mmc, добавляй оснастку "Сертификаты" ("Консоль" -> "Добавить/удалить оснастку" -> "Добавить…" -> "Сертификаты") далее на выбор три варианта ("Моей учётной записи", "Учётной записи службы", "Учётной записи компьютера") и смотри, что там лежит. Читай MSDN и пробуй подписывать. Это не сложно.

[#17.02.2010: исправил орфографию, поправил неточности в названиях пунктов меню и так по мелочи#]
Post #: 3
RE: Написание программы для проверки электронной подписи - 2010-02-10 14:44:04.693333   
Ustyugova

Сообщений: 3
Оценки: 0
Присоединился: 2010-02-08 19:21:17.780000
Спасибо, но возникли вопросы.(хеширование пока не использую)
Технология: Берем закрытый ключ с E-token, на его основе генерируем открытый ключ
closeKey = функция получение ключа с E-token
openKey = closeKey.Export(CngKeyBlobFormat.GenericPublicBlob);
Какой функций получить ключ? и правльно ли я создаю открытый? Какой функцией добавить открытй ключ к файлу, пока просто дописывала в конец, но это наверное не правильно?
И еще, наверное, тупой вопрос, но не совсем поняла как проверять если не используем хеш?
Post #: 4
RE: Написание программы для проверки электронной подписи - 2010-02-10 22:35:03.650000   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
1. Какой функций получить ключ?
Функцией Export.
2. Какой функцией добавить открытый ключ к файлу, пока просто дописывала в конец, но это наверное не правильно?
Зачем "неправильно" - вполне жизнеспособный вариант.
Существует 3 способа (сужу по возможностям пакета GNU PG):
1) Не используется хеш функция вообще, берётся все тело документа и шифруется открытым ключом. Сам открытый ключ дописывается в конец файла. При этом создается сжатый зашифрованный документ, имеющий внутри себя ключ для расшифровки (открытый ключ).
2) Используется хеш функция, но подпись дописывается в конец файла.
3) Используется хеш функция и создается отделённая подпись. При этом подпись сохраняется в отдельный файл или в базу данных.

3. как проверять если не используем хеш?
Для проверки нужны два компонента.
1) открытый ключ (файл с расширением CER). В данном случае это "отпечаток ключа" + "Идентификационные данные" + "Подпись".
Например.
"Отпечаток ключа" = 7F00 1D87 7A50 2264 3071 3F22 03E0 8648 965B 9894.
"Идентификационные данные" = Имя:TECTEP, e-mail:TECTEP@…ru, info: ключ для подписания
"Подпись" = заверяем отпечаток и идентификационные данные подписью (другим ключом которому мы доверяем), этого можно и не делать, но тогда придётся назначить данный ключ первичным.
2) зашифрованный документ с подписью. Это шифр полученный с помощью шифрования исходного документа, в качестве ключа шифрования использовалась строка в 1024, 2048, 4096 бай (использовался секретный закрытый ключ), а для расшифровки этого документа используется короткий "Отпечаток ключа".

Итак, как создать зашифрованный документ с подписью с возможностью проверки подписи (то что написано дальше полёт фантазии, так как я так никогда еще не делал).
а) экспортировать открытый ключ в файл и дать его человеку, который будет проверять целостность документа.
б) взять тело документа, добавить к нему аттрибуты: дату "подписания", кто "подписал", зачем "подписал", также надо добавить в качестве аттрибута "отпечаток ключа" (в данном случае 7F00 1D87 7A50 2264 3071 3F22 03E0 8648 965B 9894).
в) Упаковать все это например алгоритмом gzip (этот шаг необязателен)
г) зашифровать тело документа подкрёплённое аттрибутами, используя в качестве шифра закрытый ключ.
д) к получившемуся зашифрованному документу дописать новый аттрибут - отпечаток ключа (7F00 1D87 7A50 2264 3071 3F22 03E0 8648 965B 9894).

Теперь пользователь получает такой документ. Что он делает.
1) Отделяет от документа аттрибут "отпечаток ключа" = 7F00 1D87 7A50 2264 3071 3F22 03E0 8648 965B 9894
2) с помощью этого отпечатка расшифровывается весь остальной документ
3) из расшифрованного документа выделяются части:
* Тело оригинального документа
* Аттрибуты подписи - Дата, Причина, Комментарий
* Выделяется и отпечаток - 7F00 1D87 7A50 2264 3071 3F22 03E0 8648 965B 9894
4) сравниваются извлечённый отпечаток и дописанный в конец отпечаток, допустим они совпали.
5) по отпечатку находится соответствующий открытый ключ в хранилище ключей, и из того открытого ключа получаются все недостающие данные - кому он выдан, до какого числа он действителен, какой алгоритм использовался при его создании, ….

Вот как то так.
Наверняка все это можно сделать одной командой используя CapicomSDK (и шифрование и проверку), а возможно придётся повозиться. Наверняка на такой способ шифровки (без хеша с дозаписью ключа в конец файла) есть соотвествующей RFC или ГОСТ, но я с ними не сталкивался.
Советую почитать документацию к GNU PGP - думаю там подробно описана такая реализация ЭЦП.

PS: в своём предыдущем посте (тот что выше) я написал что RSA - это алгоритм симметричного шифрования. Это я ошибся - всё наоборот. RSA - алгоритм ассиметричного шифрования. Шифруем мы одним набором данных (1024 байта секретной информации - закрытый ключ), а расшифровываем другим набором данных (20 байт открытой информации - отпечаток ключа). В этом и заключается ассиметричность алгоритма.
Post #: 5
RE: Написание программы для проверки электронной подписи - 2010-02-10 23:14:54.626666   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
Что то я перегнул. Написал какой-то бред. Не знаю пока как эффективно сделать проверку в случае
>>"если не используем хеш".
В GNU PG как то она делается, надо разобраться как. Пока не знаю.
——————————
Подумал и решил так (во многом совпадает с моим "бредовым" постом выше).
Проверка "подписи" строится на доверии определённому открытому ключу, хранимому отдельно от "подписываемого файла".
—-Процесс подписания без использования хешифрования (он превращается шифрование):—-
1. Взять документ, добавить к нему аттрибуты подписания (дату, комментарий)
2. зашифровать это всё (можно по отдельности - отдельно документ отдельно аттрибуты) закрытым ключом.
3. добавить к зашифрованному документу новый аттрибут - "отпечаток ключа", которым это все можно расшифровать.

—Процесс проверки:—-
1. Взять документ, выделить из него "отпечаток ключа", указывающий на открытый ключ.
2. Поискать среди открытых ключей к которым есть доверие ключ с таким отпечатком.
3. Если ключ найден, то расшифровываем документ и аттрибуты - получаем оригинальный текст и комментарии подписавшего (зашифровавшего).
Если же по отпечатку не найдено ни одного ключа - то документ липовый. Не расшифровывает его даже.

—Предположим что злой чел переделал документ и зашифровал его сам—-
1. Он взял документ и выделил из него "отпечаток ключа" (последний аттрибут)
2. расшифровал тело документа и аттрибуты подписания
3. отредактировал тело и аттрибуты
4. зашифровал все это своим закрытым ключом, который не совпадает с нашим (зашифровать нашим он не может, так как наш ключ это супер-пупер случайная последовательность минимум из 1024 байт и её никак не восстановить по открытому "отпечатку ключа")
5. снабдил зашифрованный документ своим открытым ключом и подсунул это нам.
Но это ему ничего не даст - при проверке мы обнаружим подвох.

Если он снабдит документ прежним (нашим) отпечатком ключа - то при расшифровке получится ерунда вместо хакнутого текста - расшифровать никто не сможет.
Если снабдит своим отпечатком, то проверяющий сравнит отпечаток в "открытом ключе" предполагаемого автора и в документе, выяснит что они не совпадают и поймет, что подпись нарушена.
Достаточно надёжная защита.
Post #: 6
RE: Написание программы для проверки электронной подписи - 2010-02-11 14:42:09.936666   
Ustyugova

Сообщений: 3
Оценки: 0
Присоединился: 2010-02-08 19:21:17.780000
tеstеr спасибо, очень помог, получилось реализовать)))
Post #: 7
RE: Написание программы для проверки электронной подписи - 2010-02-15 20:29:46.633333   
BOZKURT

Сообщений: 1
Оценки: 0
Присоединился: 2010-02-15 20:23:36.720000
Ustyugova пожалуйста, если не трудно, отправьте мне на мыло пример Вашей реализации на C#. А то я никак не въеду в эти ЭЦП, сертификаты (и вообще как создавать свои сертификаты). Вы бы мне очень помогли.
Спасибо заранее!

mtm <> mail.kz
Post #: 8
RE: Написание программы для проверки электронной подписи - 2010-12-03 02:04:17.770000   
Torwig

Сообщений: 1
Оценки: 0
Присоединился: 2010-12-03 01:40:37.016666
Доброго времени суток.
Темка немного давняя, но вот подвернулась задачка и может кто знает:
1. Есть зашифрованный хеш. Как создать сертификат формата Х.509, чтобы в нем хранился именно тот внешний ключ с пары public key/private key, которая применялась при шифровании хеша?
2. Как сертификат и зашифрованный хеш прикрепить/привязать к самому файлу, который подписывается, чтобы получить так называемые Digital Sighned Data.
Язык C#.
Post #: 9
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Написание программы для проверки электронной подписи







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.