Учебная обработка: показывает, как 1С шифрует данные карты перед отправкой в платёжный шлюз - на чистом встроенном языке, без COM, .NET и внешних компонент. Номер карты шифруется публичным ключом шлюза, тут же расшифровывается приватным (так делает шлюз), а тело запроса подписывается. Всё на вымышленных данных, одной кнопкой.
Главное отличие от того, что уже лежит на площадке. Почти все реализации RSA в 1С зовут RSACryptoServiceProvider из .NET через COM. Это работает на машине, где .NET зарегистрирован для COM (regasm), и не работает больше нигде: ни на Linux-сервере, ни в тонком клиенте, ни на голой Windows без регистрации. Здесь RSA написан целиком на BSL, поэтому тот же код идёт где угодно.
Что показывает
Одна кнопка «Показать принцип» прогоняет весь цикл и заполняет поля по шагам:
- Публичный ключ шлюза (пара N, E). В бою его отдаёт шлюз по своему API; в демо встроен учебный ключ на 256 бит - маленький, чтобы считалось за пару секунд.
- Шифрование номера карты публичным ключом - возведение в степень E по модулю N.
- Шифртекст в base64 - только он ушёл бы в шлюз, сырого номера карты в запросе нет.
- Расшифровка приватным ключом (так делает шлюз, у которого есть закрытая часть). Совпадение с исходным доказывает, что асимметрия работает, и всё это без единого сетевого вызова.
- Подпись запроса: SHA256(base64(тело) + ключ проекта). Тоже нативно, без COM.
Как устроено ядро
RSA - это возведение в степень по модулю над очень большими числами, а нативного длинного целого в 1С нет. Поэтому число хранится массивом «лимбов» по основанию 106, а поверх собрана арифметика:
- сложение, вычитание, сравнение - «в столбик»;
- умножение больших чисел - школьный столбик;
- остаток от деления - алгоритм Кнута (нормализация, оценка частного, коррекция);
- возведение в степень по модулю - square-and-multiply.
Скорость - отдельная история. Первая версия считала модульное умножение через сдвиг-и-сложение, и расшифровка занимала 25 секунд. Переход на умножение с делением Кнута дал ускорение примерно в 8 раз: демо-ключ 256 бит расшифровывается за пару секунд.
Сверено с эталоном
Корректность проверена не только тем, что расшифровка совпадает с исходным. Тот же шифртекст независимо посчитан реализацией на арифметике больших чисел (BigInt) - и совпал байт в байт по всем тестовым входам, включая кириллицу. Плюс классический учебный вектор RSA: n=3233, e=17, d=413, число 65 шифруется в 2790 и расшифровывается обратно в 65.
Требования
- Платформа 8.3.14 и выше, управляемое приложение.
- Больше ничего. Ни COM, ни .NET, ни внешних компонент. Работает и на Linux-сервере, и в тонком клиенте, и в веб-клиенте.
- Ничего не читает и не пишет в базу, сети не касается: демо полностью локальное.
- Код открыт.
Что это и что нет
Это учебная демонстрация принципа, а не готовый модуль интеграции и не боевая криптобиблиотека. Сознательно упрощено, чтобы не заслонять суть:
- ключ 256 бит - для скорости и наглядности; в бою минимум 2048;
- без PKCS#1-паддинга - показываем математику RSA; в проде паддинг обязателен;
- публичный ключ в демо встроен; настоящая интеграция получает его от шлюза, хранит секреты в защищённом месте и обрабатывает ошибки платёжного API.
Полный разбор - почему в 1С без больших чисел это всё-таки собирается, как работает деление Кнута и почему COM-путь не годится для распространяемого кода - в бесплатной статье-спутнике «Как написать RSA на встроенном языке 1С».
Другие мои инструменты
Криптография на чистом BSL:
- Аудит паролей СУБД - AES-128-CBC на встроенном языке, читает пароль пользователя СУБД из файла кластера 1CV8Clst.lst.
1С и нейросети:
- Выгрузка структуры метаданных для нейросети - даёт модели устройство базы.
- Анонимизатор выгрузки - позволяет безопасно дать ей сами данные, обезличив ФИО, БИН и суммы.
Диагностика производительности:
- Карта объёмов базы 1С - из чего состоит база.
- Чек-ап СУБД - правильно ли она стоит на сервере.
- Трансформатор SQL → 1С - что делает конкретный запрос.
- Оптимизатор ВТ - как переписать то, что нашли.
Проверено на следующих конфигурациях и релизах:
- Розница, редакция 2.3, релизы 2.3.25.23
Вступайте в нашу телеграмм-группу Инфостарт