Перейти к содержанию

Нативное ГОСТ CMS-шифрование в GPGSM НАЙС.ОС

Подтверждено 24 октября 2026 года: установленный gpgsm (GnuPG) 2.4.8.1-gost с libksba-1.7.0-5.niceosc5 и libgcrypt-1.11.1 успешно создал зашифрованный CMS-файл с алгоритмом GOST28147, а затем расшифровал его без внешней команды OpenSSL. Исходные и восстановленные данные совпали по cmp и SHA-256.

Пользовательская ценность

Библиотека libksba понимает структуру CMS, GPGSM управляет операцией через сертификаты и закрытые ключи, libgcrypt выполняет необходимые криптографические преобразования. С точки зрения пользователя это означает наличие штатной команды GPGSM для зашифрованных документов ГОСТ: отдельная консольная оболочка поверх OpenSSL для локального опыта не потребовалась.

Однако это пока локальное испытание внутри одной системы. Оно не доказывает, что каждый продукт КриптоПро примет сформированный контейнер, и не означает универсальную поддержку современных CMS KARI/KExp15.

Исходные данные

В лаборатории использована следующая структура:

/root/gost-cms-test/lab/
├── gnupg/                 # изолированное хранилище GPGSM
├── niceos-lab.crt.pem     # открытый сертификат
├── niceos-lab.p12         # секретный контейнер; НЕ для обмена
├── plain.txt              # учебный текст
├── encrypted.p7e          # зашифрованный CMS
└── decrypted.txt          # восстановленный текст

Важно: P12 и закрытый ключ в реальной лаборатории имели права только для владельца, а получатель заранее был импортирован в тот же --homedir.

Проверенная команда шифрования

umask 077
LAB=/root/gost-cms-test/lab
FPR=33BEB8F5B45F947A24F0F1A2A009360D7A99DD5E

printf 'NICEOS-GOST-CMS-ENCRYPTION-TEST\n' > "$LAB/plain.txt"

gpgsm --homedir "$LAB/gnupg" \
  --always-trust \
  --cipher-algo GOST28147 \
  --recipient "$FPR" \
  --output "$LAB/encrypted.p7e" \
  --encrypt "$LAB/plain.txt"

echo "Encrypt exit code: $?"

Наблюдалось: gpgsm: encrypted data created, код 0. Отпечаток FPR относится только к лабораторному сертификату этого теста. В новой лаборатории укажите отпечаток своего сертификата.

--always-trust разрешает шифровать на самоподписанный тестовый сертификат. Для рабочих документов адресат должен быть проверен по доверенному каналу: подмена открытого сертификата при шифровании передаст секретные данные злоумышленнику.

Проверенная команда расшифрования

gpgsm --homedir "$LAB/gnupg" \
  --output "$LAB/decrypted.txt" \
  --decrypt "$LAB/encrypted.p7e"

echo "Decrypt exit code: $?"

cmp "$LAB/plain.txt" "$LAB/decrypted.txt"
sha256sum "$LAB/plain.txt" "$LAB/decrypted.txt"

Наблюдалось: расшифрование завершилось кодом 0, cmp вернул 0, SHA-256 совпал:

6479698b25febb4de7c21500e4c5b7f98de3e7b858a8157e65dca22842163e70

Это положительное испытание полного цикла шифрование → импортированный ГОСТ-ключ → расшифрование. Теперь можно обоснованно писать в документации, что нативный CMS EnvelopedData с ГОСТ 28147 работает в проверенном локальном сценарии НАЙС.ОС.

Что этот тест не покрывает

  • Обмен зашифрованными контейнерами с КриптоПро, включая UKM, транспортный MAC, параметры кривых и выбор набора замен.
  • Проверку tamper-resistance содержимого и транспортных полей. Само EnvelopedData с историческим ГОСТ28147 не является электронной подписью всего документа.
  • Надёжность получения открытого сертификата адресата в корпоративной среде.
  • Несколько получателей, большие файлы, произвольные бинарные вложения, 2001/512, современные KARI и KExp15.

Для проверки обмена именно с КриптоПро используйте следующее руководство. Для безопасности подпишите документ до его шифрования и проверяйте подпись после расшифрования.