Этот каталог содержит реализацию хэш‑функции ГОСТ Р 34.11‑2018 (Стрибог) на Python для выхода 512 бит.
Основной сценарий использования — вычисление хэша для:
- произвольной строки;
- содержимого файла;
- встроенных тестовых векторов из стандарта.
main.py— CLI‑утилита и высокоуровневый интерфейс:- парсинг аргументов командной строки;
- функции
hash_bytes(...)иhash_string(...)для использования из кода; - обработка тестовых векторов/файлов/строк.
compression.py— сжимающее отображение (G):- константы
C[0..11]; - генерация раундовых ключей
calcK; - функция
compression(hash, input, N, istest).
- константы
xBlock.py— побитовое сложение по модулю 2 (операцияX).sBlock.py— нелинейное байтовое преобразование (S‑подстановка,S).pBlock.py— перестановка байтов (операцияP).lBlock.py— линейное преобразование (операцияL).
Модуль подключается через functional_hash.py (корень репозитория), который вычисляет хэш по секциям ELF, влияющим на выполнение (.text, .rodata, .data, .plt и др.), и экспортирует elf_functional_hash(path) и is_available(). Напрямую из основного кода модуль не импортируется.
- Python 3.7+.
- Внешних библиотек не требуется, используется только стандартная библиотека (
argparse,binascii,sys).
C-расширение (ускорение для больших данных): в каталоге есть исходник gost34native.c и setup.py. При сборке расширения (python setup.py build_ext --inplace или pip install -e .) модуль main.py автоматически использует нативную реализацию хэша вместо чисто Python. Требуется компилятор C (MSVC на Windows, gcc/clang на Linux/macOS). Если расширение не собрано или недоступно, используется реализация на Python.
Перейдите в каталог с кодом:
cd gost34.11-2018Все команды выполняются из каталога gost34.11-2018:
- Хэш произвольной строки (UTF‑8 по умолчанию):
python main.py -s "Привет, мир"- Хэш содержимого файла:
python main.py -f path/to/file.bin- Запуск встроенных тестов:
python main.py -t 1
python main.py -t 2Опция -v/--verbose включает подробный отладочный вывод (промежуточные значения внутри сжимающего отображения):
python main.py -t 1 -v
python main.py -f path/to/file.bin -vВывод команды имеет вид:
H(M) = <128-символьный hex-хэш>
Каталог должен быть доступен в PYTHONPATH или находиться рядом со скриптом, из которого выполняется импорт.
from main import hash_bytes, hash_string
# Хэш строки (UTF‑8)
digest1 = hash_string("Привет, мир")
print(digest1)
# Хэш произвольных байтов
data = b"\x01\x02\x03"
digest2 = hash_bytes(data)
print(digest2)Обе функции возвращают строку длиной 128 символов, содержащую 512‑битное значение хэша в шестнадцатеричном представлении.
- Реализация на Python ориентирована на наглядность и простоту.
- Для больших файлов рекомендуется собрать и использовать C-расширение (
gost34native.c), что существенно снижает время расчёта хэша. - В реальных системах можно также использовать проверенные сторонние реализации ГОСТ 34.11‑2012/2018.