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

ГОСТ CMS EnvelopedData: шифрование файлов и транспорт ключа

Что получает пользователь

CMS EnvelopedData позволяет шифровать файл для одного или нескольких адресатов: каждый адресат использует свой закрытый ключ, а содержимое документа шифруется случайно созданным сеансовым ключом. Наличие общего контейнера не означает, что получатели получают доступ к закрытым ключам друг друга.

В патче GnuPG NiceSOFT r11/r12 предусмотрен нативный путь gpgsm --encrypt / --decrypt для исторического ГОСТ-CMS-профиля: получатели с ключами ГОСТ-2001 и ГОСТ-2012/256/512, транспортный контейнер KTRI с VKO/UKM и имитовставкой на защищённом ключе, шифрование содержимого ГОСТ 28147-89. Связка требует подходящей libksba NiceSOFT r4 и libgcrypt. Патч включает самостоятельную команду nicesoft-gost-cms через OpenSSL, но это отдельная вспомогательная утилита, не заменяющая нативную реализацию gpgsm и не устанавливающаяся автоматически вместе с GnuPG.

Почему нельзя автоматически обещать любое ГОСТ-шифрование

Наличие поддержки «Магмы» и «Кузнечика» в OpenSSL Engine и работа ГОСТ-PFX не означает, что gpgsm поддерживает modern KARI/KExp15 в CMS. В приложенном патче этот профиль не заявлен реализованным. Для некоторых сочетаний типа получателя и шифра содержимого имеется явный отказ: нельзя просто выбрать AES256 с ГОСТ-транспортом ключа старого профиля и ожидать корректного CMS.

Безопасность: шифрование ГОСТ 28147-89 в историческом EnvelopedData не является аутентификацией всего содержимого. Имитовставка в транспортном блоке защищает перенос ключа; она не подтверждает неизменность всего сообщения. Если необходима подлинность документа, сначала подпишите исходный файл CMS, затем зашифруйте подписанный контейнер и после расшифрования обязательно проверьте подпись.

Локальный тест НАЙС.ОС → НАЙС.ОС

После подтверждённого импорта лабораторного ключа в /root/gost-cms-test/lab/gnupg можно выполнить следующий ещё не подтверждённый сквозной тест. Используется изолированная лабораторная среда, самоподписанный сертификат и временный обход проверки цепочки только при шифровании.

umask 077
LAB=/root/gost-cms-test/lab
cd "$LAB"

printf 'NiceOS native GOST CMS encryption test\n' > plain.txt
sha256sum plain.txt

gpgsm --homedir "$LAB/gnupg" --list-keys
# Получите точный отпечаток лабораторного сертификата из вывода:
# gpgsm --homedir "$LAB/gnupg" --with-colons --list-keys

Укажите фактический отпечаток, не номер строки и не имя владельца:

FPR='ОТПЕЧАТОК_ЛАБОРАТОРНОГО_СЕРТИФИКАТА'

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

gpgsm --homedir "$LAB/gnupg" \
  --output "$LAB/recovered.txt" --decrypt "$LAB/envelope.der"

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

--always-trust разрешён только для самоподписанного тестового адресата, без проверки его цепочки. Производственные адресаты должны проходить проверку подлинности сертификата, срока, отзыва и назначения. Защищённый закрытый ключ обслуживает gpg-agent; при необходимости появится запрос Pinentry. Нельзя указывать его пароль в командной строке.

Критерии успешности: код 0 у --encrypt, код 0 у --decrypt, совпадение через cmp, корректный OID содержимого ГОСТ 28147, отказ на искусственно повреждённом transport MAC. Если первый запуск успешен, перенесите в отдельный тестовый контейнер тот же файл, изготовленный КриптоПро, и повторите сравнение.

Испытания с КриптоПро на macOS

Проверяйте оба направления в одной лабораторной постановке:

  • КриптоПро шифрует на публичный лабораторный сертификат НАЙС.ОС, который хранит свой закрытый ключ только на НАЙС.ОС; GPGSM расшифровывает.
  • GPGSM шифрует на публичный лабораторный сертификат КриптоПро, которому соответствует приватный ключ на Mac; КриптоПро расшифровывает.
  • Во всех случаях явно фиксируйте шифр содержимого, схему RecipientInfo, кривую, хэш, OID транспорта, число получателей и SHA-256 исходных данных.

Не используйте действующий квалифицированный ключ на Рутокене для экспериментов с расшифрованием: ограничения токена/провайдера могут не соответствовать сценарию Key Agreement, а статус подписи и разрешённые назначения требуют отдельного рассмотрения.

Несколько получателей и тесты безопасности

В исходном тестовом наборе tests/gost/test-cms-native.py предусмотрены 11 профилей получателей, пустые и длинные сообщения, совместимость с OpenSSL в обе стороны, смешанные и несколько адресатов, а также отбраковка неправильных UKM, кривых, MAC, внешних параметров и транспорта. Наличие этих тестов в патче не является свидетельством успешного запуска в установленной системе. Рекомендуется выполнить их отдельно с указанием версий библиотек и кода завершения.

См. пошаговую программу КриптоПро и ошибки расшифрования.