"С юга дуют молодые ветра..." (с) 7Б
D0 92 D1 81 D0 B5 D0 BC 20 D0 B7 D0 B4 D1 80 D0 B0 D1 81 D1 8C D1 82 D0 B5 21 - это "Всем здрасьте!" в Юникоде
Что такое стрибог? Это бог ветра в древнеславянской мифологии. А в наши дни это есть современный российский криптографический алгоритм вычисления хеш-функции с длиной блока входных данных 512 бит и с размером хеш-кода 256 или 512 бит по ГОСТ Р 34.11-2012. Введен в действие с 1 июня 2019 года на замену устаревшему стандарту ГОСТ Р 34.11-94. Применяется в современной криптографии на государственном уровне.
Подробно расписывать его нет смысла, т.к. это нудно можно найти по нему подробную информацию в Е-сетях.
В пространстве 1С на данный момент вроде бы не существует реализации данного алгоритма, поэтому решился это исправить.
Выбор был между 1С и внешней компонентой. На 1С работало бы медленно, т.к. алгоритм требует множество вычислений, а на виртуальной машине 1С это, мягко сказать, уныло. Поэтому выбор пал на внешнюю компоненту.
В основном, внешние компоненты пишутся на крестах (C++), да и официальный шаблон предоставляется на них же. Я как-то в прошлом уже писал внешнюю компоненту, но она была сделана на шаблоне от Infactum - там почти нет указателей и прочих сложностей плюсов, так что немного разбираясь в C++, на ней можно сварганить что-то своё.
Мои знания C/C++ ограничиваются опытом из универа, несколькими онлайн-курсами, самоподготовкой и святой книгой:
Это фундаментальная библия программиста, так что всем рекомендую её прочитать - сразу будет +10 к опыту во всех ЯВУ.
Раньше боялся вникать в шаблон от 1с, но решил, что время пришло, и бросился во все тяжкие )
Пришлось управлять памятью (выделять и возвращать её), двигать указатели, конвертировать значения, бороться с утечками памяти, страдать с кодировками и прочие жути, которые приходится преодолевать при разработке на C/Cpp.
Забегая вперёд, скажу, что хватило одного вечера, чтобы понять, как там в шаблоне всё устроено. Ну или почти всё, чтобы знать где/что/как/куда дописать, чтобы компонента собралась и заработала. Написать Си-код - это половина успеха. Вторая часть квеста - это сборка проекта под Win и Lin, да так, чтобы оно одинаково правильно работало во всех ОС и платформах. Но нет ничего невозможного. Потратив N-цать часов у меня был готовый результат - кроссплатформенная компонента, которая поддерживает Windows & Linux (думаю, это покрывает 99% всех кейсов).
Описание реализации алгоритма Стрибог можно найти в интернетах. Его спецификация открыта и детально расписана по шагам.
В компоненте реализованы 3 свойства:
- Компонента (Component) - информация о компоненте
- Версия (Version)
- Автор (Author)
Т.к. хеш-функция может рассчитывать хеш в двух вариантах (256 или 512 бит), то сделал всего 2 метода, чтобы кодеры не ошибались с вводом размера хеша и я не писал лишний код на корректность размера:
- ДлинныйХеш (LongHash) - размер хеша 512 бит
- КороткийХеш (ShortHash) - размер хеша 256 бит
Каждая из этих функций принимает на вход 2 параметра и возвращает хеш-сумму в строковом хекс-формате в верхнем регистре (типа, DEADC0DE).
1-й параметр функции - строка - тип передаваемого значения (один символ), возможны 5 валидных вариантов (в любом регистре):
- с (s) - строка UTF-8
- о (o) - строка Windows-1251
- б (b) - base64 от двоичных данных
- п (p) - путь к файлу
- д (d) - двоичные данные (недоступно в веб-клиенте)
2-й параметр - значение в соответствующем формате, для которого надо вычислить хеш-сумму.
Надеюсь, всем должно быть известно, что хеш рассчитывается от двоичных данных, поэтому любые другие типы данных сначала конвертируются в бинарник. Поэтому в компоненте реализована возможность расчёта хеша от "однобайтовой" строки (о) и от обычной Юникод-строки (с). Первая как раз нужна, чтобы быстро проверить корректность работы алгоритма согласно спецификации.
Пример: допустим вам надо вычислить хеш-сумму следующей строки:
"Се ветри, Стрибожи внуци, веютъ с моря стрелами на храбрыя плъкы Игоревы" - если что, это пасхалка из спецификации )
Будьте внимательны, в спецификации строки приведены в "однобайтовой" кодировке. Тогда в коде 1с нужно написать:
Стрибог = Новый("AddIn.GOST.Streebog");
ВашХеш = Стрибог.ДлинныйХеш("о", ВашаСтрока);
Протестировано на платформах 1с: 8.3.23 и 8.3.26 (на ОС: Win32, Win64, Lin64).
В прикрепленных файлах находится архив внешних компонент "StreebogAddIn.zip" и отдельно тестовая обработка "TestStreebogAddIn.epf" (без компонент), в которой реализовано асинхронное взаимодействие с внешней компонентой (в макет "StreebogAddIn" данной обработки нужно вложить zip-архив с внешними компонентами).
Streebog256: 453EED5F7346D3F0C153DE456AB9E8F913E0692FD7815AEFE9A0DE4E2946A160 *StreebogAddIn.zip 9835C79AA8CD0DC3665FE7FBB47F97150268D1FD6D6828ECB2BC375600D3A8C5 *TestStreebogAddIn.epf Streebog512: CF21C2DBBE718C9962FD90A57E079C6447A877AD44AEB8BDA1D2979A929011FFC54DF78F12FA75E993EF695105CCB3F88BAE0325EC5F5F332123EB3082846697 *StreebogAddIn.zip 03CF7E662FA809A6228E38602D16DA6AFC58DD95BC2EE8E1AD71A31E9B2B0542E4F4998F0576F41F1B7DA9F8B0587145C09A450915AFEDB992B976D35150043A *TestStreebogAddIn.epf
Не забывайте заценить другие мои разработки в моём профиле или на гитхабе.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.433