Цифровая подпись
В качестве средства разработки используем Borland C++ (или Visual Studio c++, C#). Создадим dll-библиотеку, выполняющую подпись и верификацию подписи, и с помощью COM-технологии встроим ее в контекстное меню Windows.
Процедура создания подписи:
1. Получаем имя файла при вызове программы.
2. Открываем диалоговое окно, запрашиваем у пользователя имя результирующего подписанного файла и место его расположения.
3. Открываем личное хранилище сертификатов пользователя «My».
4. Получаем контекст сертификата, который будет использо-ваться для подписи и его секретный ключ.
5. Для подписи файла будем использовать функцию CryptSignMessage. Инициализируем структуру, которая необходима для подписи, в ее поля внесем информацию о сертификате, с помощью которого производится подпись, алгоритм формирования хеш-значения подписанных данных и остальные дополнительные параметры. Параметр fDetachedSignature задает тип получаемой цифровой подписи (отделенная или совмещенная с данными). Мы создаем отделенную подпись, это позволит читать файл без его предварительной расшифровки. Также в этой структуре есть поле-указатель на подписываемые данные. После определения всех параметров структуры, первый раз функцию вызываем для вычисления размера подписи. Затем вызываем эту же самую функцию второй раз с буфером определенного размера, в который и будет помещена созданная подпись.
6. В результирующий файл переписываем исходный файл. Затем записываем размер исходного файла, который понадобится для проверки подписи. Далее записываем имя подписчика и саму подпись и ее длину. Кроме ого, впишем строку «This file is signed» для того, чтобы при проверке можно было точно определить, что проверяется подписанный файл. Функция CryptSignMessage создает подпись в формате PKCS и дает возможность в подпись внести дополнительную информацию, например о сертификате подписчика.
Процедура проверки подписи файла:
1. Открываем файл, считываем последнюю строку, если это строка «This file is signed». Значит, файл подписан и его можно проверять.
2. Считываем длину подписи и саму подпись.
3. Далее считываем имя подписчика.
4. Считываем размер исходных подписанных данных и сами исходные данные. 5. Для проверки подписи будем использовать функцию CryptVerifyDetachedMessageSignature. Одним из входных параметров функции является структура, поля которой содержат извлеченную нами подпись, исходные данные и сертификат подписчика. Сертификат подписчика запрашиваем в каталоге Active Directory.
6. Данная функция при вызове возвращает логическое значение, если оно истинно, значит, подпись верна, и мы сообщаем об этом пользователю.
Для встраивания в контекстное меню создадим небольшой COM-сервер, куда и впишем вышеописанные процедуры. Для того, чтобы программа вызывалась из контекстного меню Windows, необходимо прописать ее регистрацию в реестре операционной системы для любого расширения файлов.