Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Виктор Н.  
#1 Оставлено : 8 мая 2026 г. 18:35:19(UTC)
Виктор Н.

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.05.2026(UTC)
Сообщений: 1

Здравствуйте.

Для поддержки ГОСТ шифрования в одном из проектов нам требуется поддержка следующие алгоритмов/механизмов: KDF, симметричное шифрование, HMAC. Но в процессе экспериментов с ними возникло несколько проблем. Помогите с ними разобраться пожалуйста.

Вся информация приведённая ниже относится к релизу CSP 5.0 R3 49030

# KDF

Требуется заменить `PBKDF2WithHmacSHA256`.

В документации я нашёл класс `JCPPBEKeySpec`, в котором объявлена константа `PBKDF2_2012_256`, соответствующая алгоритму `ГОСТ 34.11-2012`.
Но не получается использовать эту спецификацию ключа с `SecretKeyFactory` - в провайдере `JCSP` отсутствуют алгоритмы `GOST3411_2012_256` или `PBKDF2_2012_256` .

После неудачи с `JCPPBEKeySpec` и `SecretKeyFactory` я попробовал реализовать вручную PBKDF2 через Hmac.
Ручная реализация с `HmacSHA256` выдаёт тот же результат, что и вызов стандартного генератора с `PBKDF2WithHmacSHA256`. При попытке воспользоваться ручной реализацией с алгоритмом `HmacGOST3411-2012-256` получаю ошибку `Invalid key algorithm: HmacGOST3411-2012-256` при инициализации объекта `Mac` спецификацией ключа:

Цитата:

val mac = Mac.getInstance(hmacAlgo)
mac.init(SecretKeySpec(password, hmacAlgo))


К сожалению в документации и в примерах отсутствуют примеры работы с PBKDF2 и Mac - в Руководстве программиста JCSP и Android имеются только примеры по созданию экземпляра `Mac.getInstance` и генерации `SecretKey` для 512 битных ключей в разделе 3.10.

Как правильно воспользоваться ГОСТ PBKDF2 и HMAC с JCSP провайдером?


# Симметричное шифрование

Требуется заменить `AES-256-CBC`.

Планируем его заменить на `GOST3412_2015_K/CBC/PKCS5_PADDING`, но также имеются проблемы с получением сущности ключа для передачи в `Cipher` из-за недостатка документации и примеров.
Ключ должен быть результатом KDF (который я описал выше). Далее нужно либо воспользоваться готовым `SecretKey` (если отработал `SecretKeyFactory` с алгоритмом `GOST3411_2012_256`) либо преобразовать байты ключа через `SecretKeySpec` в сам ключ.

Попробовал разные варианты `SecretKeySpec` (с наполнением ключа в виде массива байт на 256 бит/32 байта):

  • javax.crypto.spec.SecretKeySpec


Цитата:

val spec = SecretKeySpec(bytes, JCP.GOST_K_CIPHER_NAME)


Преобразовании спеки ключа через следующий код (по документации):

Цитата:

with(SecretKeyFactory.getInstance(JCP.GOST_K_CIPHER_NAME, JCSP.PROVIDER_NAME)) {
generateSecret(keySpec)
}


Приводит к такому эксепшену:

Цитата:

java.security.spec.InvalidKeySpecException
at ru.CryptoPro.JCSP.Key.GostSecretKeyFactory.engineGenerateSecret(Unknown Source:19)
at javax.crypto.SecretKeyFactory.generateSecret(SecretKeyFactory.java:524)



Использование напрямую в `Cipher.getInstance("${JCP.GOST_K_CIPHER_NAME}/CBC/PKCS5_PADDING", JCSP.PROVIDER_NAME)` приводит к такому эксепшену:

Цитата:

Caused by: java.lang.IllegalArgumentException: Import of key failed.
at ru.CryptoPro.JCSP.Key.SecretKeyImpl.a(Unknown Source:37)
at ru.CryptoPro.JCSP.Key.SecretKeyImpl.importRawKey(Unknown Source:64)
at ru.CryptoPro.JCSP.Key.JCSPSecretKeySpec.<init>(Unknown Source:0)
at ru.CryptoPro.JCSP.Key.JCSPSecretKeySpecK.<init>(Unknown Source:0)
at ru.CryptoPro.JCSP.Key.GostSecretKey.extractSpec(Unknown Source:288)
... 75 more
Caused by: java.lang.IllegalArgumentException: Hash or Sign MSCAPI ERROR: 0x80090008
at ru.CryptoPro.JCSP.MSCAPI.HProv.createHash(Unknown Source:206)
at ru.CryptoPro.JCSP.MSCAPI.HProv.initHash(Unknown Source:3)
2026-05-08 17:42:12.337 5360-5360 AndroidRuntime ru.cryptopro.acsp.examples E at ru.CryptoPro.JCSP.Key.SecretKeyImpl.a(Unknown Source:10)



  • ru.CryptoPro.JCP.Key.SecreKeySpec

Пробовал создать экземпляр этой спеки в таком виде:

Цитата:

val keySpec = ru.CryptoPro.JCP.Key.SecretKeySpec(
bytes,
CryptParamsSpec.getInstance(CryptParamsSpec.KUZNECHIK)
)


При передаче такой спеки в `SecretKeyFactory` получаю такой эксепшн:

Цитата:

java.security.spec.InvalidKeySpecException
at ru.CryptoPro.JCSP.Key.GostSecretKeyFactory.engineGenerateSecret(Unknown Source:19)
at javax.crypto.SecretKeyFactory.generateSecret(SecretKeyFactory.java:524)


  • JCSPSecretKeySpecK (JCSPSecretKeySpec)

В библиотеке JCSP.jar я нашёл специализированные спеки `JCSPSecretKeySpec`, но они ни в одной документации не описаны и неясно как в них передать байты ключа. В `JCSPSecretKeySpec` есть конструктор, который принимает в себя массив байт и затем преобразовывает его через `importRawKey`, но он `protected` и других подобных публичных конструкторов нет.


Где можно найти рабочие примеры с симметричным шифрованием?


# HMAC
Требуется заменить `HmacSHA256`

Планируем заменить на `HmacGOST3411-2012-256`.
Фактически проблема та же, что в первом пункте про KDF.


# Android Native CSP

Увидел, что в поставке теперь есть библиотека Native CSP с Си интерфейсом. Подскажите, она работает через JNI с JVM провайдерами или напрямую с нативной библиотекой CSP? Где можно найти документацию по ней?
Есть ли подобная библиотека под iOS платформу (без использования XCFramework)?

Отредактировано пользователем 8 мая 2026 г. 18:38:07(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.