При интеграции 1С с внешними системами часто возникает необходимость использования криптографических алгоритмов, реализованных в библиотеках .NET Framework. Стандартный механизм работы через COMОбъект в 1С имеет существенное ограничение: он не поддерживает вызов конструкторов объектов с параметрами. Рассмотрим подробнее, как обойти это ограничение и реализовать полноценное шифрование, например, с использованием класса RSACryptoServiceProvider.
В обычном сценарии программист 1С пишет код: ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider"). Это работает для инициализации объекта со значениями по умолчанию. Однако, если нам нужно создать объект с конкретной длиной ключа (например, 2048 бит) или использовать специфический контекст провайдера, конструктор требует передачи параметров. Попытка написать Новый COMОбъект("Класс", Параметр) в 1С приведет к ошибке, так как механизм COM-интеропа в Windows не умеет передавать аргументы непосредственно в конструктор .NET при создании экземпляра.
Для решения этой задачи проанализируем использование специализированных библиотек-переходников, таких как NetObjectToIDispatch. Этот враппер позволяет 1С работать с объектами .NET практически так же, как если бы это был родной код C#. Он берет на себя задачу вызова нужных конструкторов и статических методов.
Разберем по шагам, как инициализировать объект с параметрами:
Рассмотрим пример кода:
Врап = Новый COMОбъект("NetObjectToIDispatch45");
// Получаем доступ к типу RSACryptoServiceProvider
ТипRSA = Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider");
// Создаем объект с параметром длины ключа 2048 бит
// Это эквивалентно C#: new RSACryptoServiceProvider(2048)
ОбъектШифрования = Врап.СоздатьОбъект(ТипRSA, 2048);
Часто задача состоит не просто в создании объекта, а в импорте уже существующего публичного или приватного ключа. Выясним причину, по которой обычная передача строки ключа может вызывать ошибку "Недопустимая длина для массива символов Base-64".
Проанализируем ситуацию: ключи в криптографии обычно передаются в кодировке Base64. Однако класс RSACryptoServiceProvider ожидает данные в определенном формате (например, XML-строка или байтовый массив CSP Blob). Если ваш ключ — это просто строка символов, её необходимо правильно подготовить.
Если у вас есть публичный ключ в формате XML, используйте метод FromXmlString. Если же ключ представлен в виде двоичного объекта, рассмотрим пример с использованием метода ImportCspBlob:
// Предположим, у нас есть ключ в Base64
ПубличныйКлючBase64 = "asd2343asdasaYdnnas89932asdasd==";
// Для работы с Base64 нам понадобится тип System.Convert
Конвертер = Врап.ПолучитьТип("System.Convert");
// Преобразуем строку Base64 в массив байтов, который понимает .NET
МассивБайтов = Конвертер.FromBase64String(ПубличныйКлючBase64);
// Импортируем ключ в объект шифрования
Попытка
ОбъектШифрования.ImportCspBlob(МассивБайтов);
Исключение
Сообщить("Ошибка импорта ключа: " + ОписаниеОшибки());
КонецПопытки;
В процессе разработки важно различать алгоритмы шифрования. Проанализируем типичную ошибку: попытку использовать RSA-объект для дешифровки данных, зашифрованных алгоритмом AES. Если в коде (например, на PHP или другом языке) вы видите упоминание AES-128-CBC, то использование RSACryptoServiceProvider не даст результата.
RSA — это асимметричный алгоритм (публичный ключ для шифрования, приватный для расшифровки).
AES — это симметричный алгоритм (один ключ для обоих действий).
Для реализации логики, аналогичной PHP-функции openssl_decrypt с алгоритмом AES, в 1С через .NET враппер следует использовать класс System.Security.Cryptography.AesManaged. Посмотрим на пример настройки такого объекта:
ТипAes = Врап.ПолучитьТип("System.Security.Cryptography.AesManaged");
ОбъектAES = Врап.СоздатьОбъект(ТипAes);
// Настройка параметров, соответствующих стандартам OpenSSL
ОбъектAES.Mode = 1; // CipherMode.CBC
ОбъектAES.Padding = 3; // PaddingMode.PKCS7
ОбъектAES.KeySize = 128;
// Установка ключа и вектора инициализации (IV)
// Ключ и IV должны быть переданы как массивы байтов
ОбъектAES.Key = Конвертер.FromBase64String(СтрокаКлюча);
ОбъектAES.IV = Конвертер.FromBase64String(СтрокаIV);
При работе с криптографией в 1С часто возникают проблемы с длиной строк. Помните следующие правила:
=.Base64Строка) она может содержать символы переноса строк. Перед передачей в .NET их необходимо удалить с помощью СтрЗаменить.Таким образом, использование внешних библиотек через COM-враппер открывает для разработчика 1С всю мощь .NET Framework, позволяя обходить ограничения платформы по созданию сложных объектов с параметрами.