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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline man85  
#1 Оставлено : 25 декабря 2023 г. 21:35:43(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Есть код из примера, который шифрует по алгоритму ГОСТ 28147-89 (CMS_samples/PKCS7EnvEphTransport.java метод public static byte[] EncryptPKCS7(X509Certificate recipientCert, byte[] data))

Как переделать его в шифрование по алгоритму ГОСТ Р 34.12-2015 (блочный шифр «Кузнечик»)?
Или как по-другому создать CMS-структуру типа EnvelopedData, алгоритм шифрования ГОСТ Р 34.12-2015 (блочный шифр «Кузнечик»), тип
получателя — KeyTransportRecipientInfo
?

Используются специфичные классы Gost28147_89_EncryptedKey, Gost28147_89_ParamSet, Gost28147_89_Parameters, Gost28147_89_IV, не нашёл аналогичные для ГОСТ Р 34.12-2015.
Offline Евгений Афанасьев  
#2 Оставлено : 27 декабря 2023 г. 15:29:42(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте. Будет проще использовать EnvelopedSignature, достаточно передать в конструктор нужный алгоритм. Примеры с EnvelopedSignature есть в samples-Source.jar в пакете enveloped.
Offline man85  
#3 Оставлено : 27 декабря 2023 г. 19:14:57(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Попробовал алгоритм "Магма", но как и с "Кузнечиком" пока что ловлю NPE при попытке завернуть ключ шифрования:
Цитата:
private static byte[] wrapM2015(SecretKey secretKey, PublicKey recipientKey, ParamsInterface recipientTransportParameters) throws Exception {
String keyAlgorithm = recipientKey.getAlgorithm();
String ephKeyAlgorithm = "GOST3410DHELEPH";
if (keyAlgorithm.equalsIgnoreCase("GOST3410_2012_256")) {
ephKeyAlgorithm = "GOST3410DHEPH_2012_256";
} else if (keyAlgorithm.equalsIgnoreCase("GOST3410_2012_512")) {
ephKeyAlgorithm = "GOST3410DHEPH_2012_512";
}

KeyPairGenerator kgp = KeyPairGenerator.getInstance(ephKeyAlgorithm, "Crypto");
AlgorithmParameterSpec spec = new X509PublicKeySpec(recipientKey.getEncoded());
kgp.initialize(spec);
KeyPair ephPair = kgp.generateKeyPair();
PrivateKey privateKey = ephPair.getPrivate();
PublicKey publicKey = ephPair.getPublic();
byte[] syncro = new byte[16];
SecureRandom random = SecureRandom.getInstance("CPRandom", "JCP");
random.nextBytes(syncro);
IvParameterSpec iv = new IvParameterSpec(syncro);
KeyAgreement ka = KeyAgreement.getInstance(privateKey.getAlgorithm(), "Crypto");
ka.init(privateKey, iv);
ka.doPhase(recipientKey, true);
Key dh = ka.generateSecret("GOST3412_2015_M");
Cipher cipher = Cipher.getInstance("GOST3412_2015_M/KEXP_2015_M_EXPORT/ISO10126Padding", "Crypto");
cipher.init(3, dh, recipientTransportParameters, (SecureRandom)null);
byte[] wrappedKey = cipher.wrap(secretKey);
Gost28147_89_EncryptedKey encryptedKey = new Gost28147_89_EncryptedKey();
Asn1BerDecodeBuffer decoder = new Asn1BerDecodeBuffer(wrappedKey);
encryptedKey.decode(decoder);
byte[] imita = encryptedKey.macKey.value;
byte[] wrapperKeyBytes = encryptedKey.encryptedKey.value;
byte[] publicKeyBytes = publicKey.getEncoded();
SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo();
decoder = new Asn1BerDecodeBuffer(publicKeyBytes);
publicKeyInfo.decode(decoder);
GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
Asn1BerEncodeBuffer encoder = new Asn1BerEncodeBuffer();
keyTransport.sessionEncryptedKey = new Gost28147_89_EncryptedKey(wrapperKeyBytes, imita);
keyTransport.transportParameters = new GostR3410_TransportParameters(new Gost28147_89_ParamSet(recipientTransportParameters.getOID().value), publicKeyInfo, new Asn1OctetString(iv.getIV()));
keyTransport.encode(encoder);
return encoder.getMsgCopy();
}

на инструкции byte[] wrappedKey = cipher.wrap(secretKey);

Цитата:
Caused by: java.lang.NullPointerException
at ru.CryptoPro.JCP.Key.MagmaKExp15KeySpec.wrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.GostCoreMagmaCipher.engineWrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.BaseGostCipher.engineWrap(Unknown Source)
at java.base/javax.crypto.Cipher.wrap(Cipher.java:2535)
Offline Евгений Афанасьев  
#4 Оставлено : 27 декабря 2023 г. 19:40:29(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
В случае Магма/Кузнечик сообщение устроено иначе: нужны G3412ParamsSpec, GostR3410_12_KEG_Parameters, Gost3412_15_Encryption_Parameters, Kexp15ParamsSpec, GostR3410_GostR3412_KeyTransport. В составе примеров достаточного нового дистрибутива должен быть пример PKCS7EnvEphTransportMagma, но проще использовать EnvelopedSignature - здесь все внутри.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
man85 оставлено 28.12.2023(UTC)
Offline man85  
#5 Оставлено : 27 декабря 2023 г. 20:45:11(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
EnvelopedSignature - здесь все внутри.

Попробовал сделать по примеру:
Цитата:
ByteArrayOutputStream envelopedByteArrayOutStream = new ByteArrayOutputStream();
EnvelopedSignature signature = new EnvelopedSignature(EncryptionKeyAlgorithm.ekaKuznechik);

signature.addKeyAgreeRecipient(certificates.stream().findFirst().get());
signature.open(envelopedByteArrayOutStream);
signature.update(data);

signature.close();

return envelopedByteArrayOutStream.toByteArray();


На выходе получаю ошибку на этапе addKeyAgreement:
Цитата:
Bad type on operand stack
Exception Details:
Location:
ru/CryptoPro/CAdES/pc_1/pc_0/cl_3.generate(Lorg/bouncycastle/operator/GenericKey;)Lorg/bouncycastle/asn1/cms/RecipientInfo; @974: invokespecial
Reason:
Type 'org/bouncycastle/asn1/DERObjectIdentifier' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1ObjectIdentifier'
Current Frame:
bci: @974
flags: { }
locals: { 'ru/CryptoPro/CAdES/pc_1/pc_0/cl_3', top, 'java/security/PrivateKey', 'java/security/PublicKey', 'javax/crypto/SecretKey', top, top, top, top, top, top, top, top, top, top, top, top, top, top, top, top, '[B', top, top, top, top, 'ru/CryptoPro/JCP/params/OID', top, '[B', top, 'org/bouncycastle/asn1/DERObjectIdentifier', top, 'com/objsys/asn1j/runtime/Asn1BerEncodeBuffer', 'org/bouncycastle/asn1/ASN1InputStream', 'ru/CryptoPro/JCP/ASN/Gost28147_89_EncryptionSyntax/Gost28147_89_ParamSet', 'ru/CryptoPro/JCP/ASN/GostR3410_EncryptionSyntax/Gost28147_89_KeyWrapParameters', 'org/bouncycastle/asn1/ASN1Primitive' }
stack: { uninitialized 955, uninitialized 955, 'org/bouncycastle/asn1/DERObjectIdentifier', 'org/bouncycastle/asn1/ASN1Primitive' }





Offline man85  
#6 Оставлено : 27 декабря 2023 г. 20:51:19(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Версии библиотек КриптоПро 2.0.42119-A.
Самое интересное, что на старой версии 2.0.40132-A этот пример работал, но не мог расшифроваться:
"Ошибка расшифрования сеансового ключа зашифрованного CMS/PKCS#7 сообщения"
Offline Евгений Афанасьев  
#7 Оставлено : 27 декабря 2023 г. 20:52:34(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Автор: man85 Перейти к цитате
На выходе получаю ошибку

Версии bouncycastle, как в дистрибутиве в папке dependencies?

Автор: man85 Перейти к цитате
на старой версии 2.0.40132-A этот пример работал, но не мог расшифроваться:
"Ошибка расшифрования сеансового ключа зашифрованного CMS/PKCS#7 сообщения"

Еще надо учитывать, что в JCP поддержка Кузнечик/Магма появилась буквально в последней версии. В JCSP - существенно раньше.

Отредактировано пользователем 27 декабря 2023 г. 20:54:52(UTC)  | Причина: Не указана

Offline man85  
#8 Оставлено : 27 декабря 2023 г. 21:20:42(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
Автор: man85 Перейти к цитате
На выходе получаю ошибку

Версии bouncycastle, как в дистрибутиве в папке dependencies?


Была версия 1.60, явно задал 1.50 (как в архиве с примерами)

Получаю ту же ошибку:
Цитата:
Bad type on operand stack
Exception Details:
Location:
ru/CryptoPro/CAdES/pc_1/pc_0/cl_3.generate(Lorg/bouncycastle/operator/GenericKey;)Lorg/bouncycastle/asn1/cms/RecipientInfo; @974: invokespecial
Reason:
Type 'org/bouncycastle/asn1/DERObjectIdentifier' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1ObjectIdentifier'
Current Frame:
bci: @974
flags: { }
locals: { 'ru/CryptoPro/CAdES/pc_1/pc_0/cl_3', top, 'java/security/PrivateKey', 'java/security/PublicKey', 'javax/crypto/SecretKey', top, top, top, top, top, top, top, top, top, top, top, top, top, top, top, top, '[B', top, top, top, top, 'ru/CryptoPro/JCP/params/OID', top, '[B', top, 'org/bouncycastle/asn1/DERObjectIdentifier', top, 'com/objsys/asn1j/runtime/Asn1BerEncodeBuffer', 'org/bouncycastle/asn1/ASN1InputStream', 'ru/CryptoPro/JCP/ASN/Gost28147_89_EncryptionSyntax/Gost28147_89_ParamSet', 'ru/CryptoPro/JCP/ASN/GostR3410_EncryptionSyntax/Gost28147_89_KeyWrapParameters', 'org/bouncycastle/asn1/ASN1Primitive' }
stack: { uninitialized 955, uninitialized 955, 'org/bouncycastle/asn1/DERObjectIdentifier', 'org/bouncycastle/asn1/ASN1Primitive' }


Offline man85  
#9 Оставлено : 28 декабря 2023 г. 9:14:17(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате

Еще надо учитывать, что в JCP поддержка Кузнечик/Магма появилась буквально в последней версии. В JCSP - существенно раньше.


А как EnvelopedSignature можно "заставить" использовать JCSP?

Похоже, что AdESConfig.setDefaultProvider("...");

Отредактировано пользователем 28 декабря 2023 г. 9:49:45(UTC)  | Причина: Не указана

Offline man85  
#10 Оставлено : 28 декабря 2023 г. 10:49:11(UTC)
man85

Статус: Участник

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
Версии bouncycastle, как в дистрибутиве в папке dependencies?


Ошибся - смотрел примеры версии 44121 - там версия bouncycastle 1.50
примеры от версии 42119-А - версия bouncycastle 1.60

В примеры к версии 42119-А точно тот номер версии bouncycastle положили?

Проверьте, пожалуйста, работу примера EnvelopedSignature для версии 42119-А, всё отрабатывает корректно?

Отредактировано пользователем 28 декабря 2023 г. 10:50:32(UTC)  | Причина: Не указана

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