Стрибог - хеш-функция по ГОСТ 34.11-2012

04.02.25

Разработка - Математика и алгоритмы

Современный российский криптографический алгоритм вычисления хеш-функции с размером хеш-кода 256 или 512 бит (внешняя компонента).

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Стрибог (внешняя компонента)
.zip 422,25Kb ver:1.0
0
0 Скачать (3 SM) Купить за 2 450 руб.
Тестовая обработка для внешней компоненты
.epf 11,28Kb ver:1.0
0
0 Скачать (1 SM) Купить за 1 850 руб.

"С юга дуют молодые ветра..." (с) 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

хеш стрибог гост функция алгоритм

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    5071    stopa85    12    

39

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    10110    user1959478    54    

37

Математика и алгоритмы Разное Платформа 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    4921    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    12663    8    SpaceOfMyHead    20    

62

Математика и алгоритмы Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    6161    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    5279    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9437    7    kalyaka    11    

44
Оставьте свое сообщение