Как-то я уже размещал генератор сертификатов для использования со встроенным в 1С Менеджером криптографии. Тема не теряет популярности в среде пользователей и заказчиков и задачи, как правило, не всегда стандартные. Представляю набор процедур и функций на которых можно организовать механизмы ЭЦП и шифрования с использованием строковых RSA ключей.
Сразу стоит пояснить почему именно RSA. Главное преимущество метода в том, что ключи не привязаны к рабочей станции или серверу, то есть к профилю пользователя опрационной системы. Вторым огромным плюсом является использование всех возможностей СОМ-объектов, где возможности вашего решения ограничиваются исключительно пределами вашей фантазии или извращеной мысли. На этой обработке я тестировал все понравившиеся мне механизмы, которые можно использовать в системе внутрикорпоративного документооборота и согласования.
Что можно встроить из тест набора:
1. Систему генерации RSA ключей с автоматической записью в базу данных и на носитель.
2. Привязку ключа к носителю.
3. ЭЦП для объектов метаданных и фоновую проверку.
4 . Шифрование данных.
Для последнего пункта достаточно использовать конструкции
//шифровка
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
ОбъектШифрования.FromXmlString(<открытыйКлюч>);
//преобразование строки для шифрования в двоичный вид
ИсхТекстДвоичный = СтрокаВМассив(<ВходящийТекст>);
ЗашифрованныйТекстДвоичный = ОбъектШифрования.Encrypt(ИсхТекстДвоичный, False);
ЗашифрованныйТекст = ДвоичныеДанныеВBase64(ЗашифрованныйТекстДвоичный);
// расшифровка
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
ОбъектШифрования.FromXmlString(<секретныйКлюч>);
ЗашифрованныйТекстДвоичный = Base64ВДвоичныеДанные(<ВходящийЗашифрованныйТекст>);
РасшифрованныйТекстДвоичный = ОбъектШифрования.Decrypt(ЗашифрованныйТекстДвоичный, False);
//преобразование расшифрованных данных в строку
ВскрытыйТекст = МассивВСтроку(РасшифрованныйТекстДвоичный);
(Функции "СтрокаВМассив" и "МассивВСтроку" используются для подготовки ЭЦП и расположены в модуле обработки).
А теперь самое интересное, какую можно постороить архитектуру решения:
В базе данных создадим регистр сведений или справочник, где сопоставляем открытые ключи и пользователей, можно установить временные рамки действия ключей и привязки к носителю(н-р серийному номеру). Процедуру генерации ключей отдадим отдельной внешней обработке, которая запишет закрытый ключ на флешку, а все остальные параметры в базу данных. Создаем элементы где будет храниться сигнатура ЭЦП и/или зашифрованные данные и в общем то всё. Остается прописать логику действий и вы обладатель достаточно стойкой криптосистемы.
Важное замечание: не стоит применять эту и подобные схемы в коммерческих решениях, поскольку использование криптографии регулируется законами РФ.
P.S.: Кстати, в макете обработки лежит Native-компонента StringNative. если хочется поэкспериментировать с синхронным шифрованием, извлекайте и используйте простой код:
//////////////Подключаем//////////////////
КодВозврата=ПодключитьВнешнююКомпоненту(ПутьDLL,"StringsNative",AddInType.Native);
Если КодВозврата Тогда
СтрокиШифровки = Новый("AddIn.StringsNative.V8Strings");
СтрокиШифровки.ПодключитьКонтрольНавигационныхСсылок();
Иначе
//Не удалось подключить ВК StringsNative.dll
КонецЕсли;
////////////////////////////Шифрование/////////////////////
ШифрованнаяСтрока = СтрокиШифровки.ШифроватьСтроку(<ПереданнаяСтрока>,<ПарольСессии>);
////////////////////////////Расшифровка////////////////////
ИсходнаяСтрока = СтрокиШифровки.ДешифроватьСтроку(<ШифрованнаяСтрока>,<ПарольСессии>)
///////////////////////////////////////////////////////////