Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close