Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2019(UTC) Сообщений: 1 
|
Добрый день! Подскажите пожалуйста, где мы неправильно используем API для корректного шифрования контента? На вход нашего сервиса приходит подписанный документ по алгоритму ГОСТ Р 34.10-2012. Далее нам необходимо зашифровать документ и передать его в хранилище, где будет происходить обработка стандартными средствами КриптоПРо. На данный момент сервис шифрует документ, но принимающая сторона не может расшифровать документ (decrypt failed: FAILED: Unknown cryptographic algorithm) Код:
ContentInfo contentInfo = new ContentInfo();
PublicKey recipientPublicKey = recipientCertificate.getPublicKey();
//Выработка эфемерной ключевой пары
KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance(JCP.GOST_EPH_DH_2012_256_NAME);//GOST3410DHEPH);//JCP.GOST_EPH_DH_2012_256_NAME);
AlgIdSpec algIdSpec = new AlgIdSpec(JCP.GOST_PARAMS_EXC_2012_256_KEY_OID);//AlgIdSpec.OID_SIGN_2012_256);
pairGenerator.initialize(algIdSpec);
GostPublicKey repPublicKey = (GostPublicKey) recipientPublicKey;
ParamsInterface repPublicKeySpec = repPublicKey.getSpec().getParams();
pairGenerator.initialize(repPublicKeySpec);
KeyPair pair = pairGenerator.generateKeyPair();
logger.debugT("[GostCipherHelper] pair = " + pair);
PrivateKey ephmeralPrivateKey = pair.getPrivate();
PublicKey ephmeralPublicKey = pair.getPublic();
// Генерация вектора инициализации
byte[] agreementIV = new byte[INTIALIZATION_VECTOR_LENGTH];
SecureRandom random = SecureRandom.getInstance(JCP.CP_RANDOM);
random.nextBytes(agreementIV);
IvParameterSpec agreementParameters = new IvParameterSpec(agreementIV);
// Создание соглашения и секретного ключа
KeyAgreement agreement = KeyAgreement.getInstance(ephmeralPrivateKey.getAlgorithm());//JCP.GOST_DH_2012_256_NAME);//ephmeralPrivateKey.getAlgorithm());//, CRYPT_PROVIDER_NAME);//JCP.GOST_DH_2012_256_NAME );
agreement.init(ephmeralPrivateKey, new IvParameterSpec(sv), null);
GostPrivateKey g_prk = (GostPrivateKey)ephmeralPrivateKey;
GostPublicKey g_pbk = (GostPublicKey)recipientPublicKey;
PrivateKeySpec prk_spec = (PrivateKeySpec) g_prk.getSpec();
PublicKeySpec pbk_spec = (PublicKeySpec) g_pbk.getSpec();
AlgIdInterface prk_alg = (AlgIdInterface) prk_spec.getParams();
AlgIdInterface pbk_alg = (AlgIdInterface) pbk_spec.getParams();
agreement.doPhase(recipientPublicKey, true);
SecretKey secretKey = agreement.generateSecret(CryptoProvider.GOST_CIPHER_NAME);
// Генерация симметричного ключа
KeyGenerator keyGenerator = KeyGenerator.getInstance(CryptoProvider.GOST_CIPHER_NAME);
ParamsInterface symmetricParameters = AlgIdSpec.getDefaultCryptParams();
keyGenerator.init(symmetricParameters);
SecretKey cipherKey = keyGenerator.generateKey();
// Шифрование симметричного ключа на секретном ключе
Cipher cipher = Cipher.getInstance(CryptoProvider.GOST_CIPHER_NAME);
CryptParamsSpec pp = CryptParamsSpec.getInstance(CryptParamsSpec.VERBAO); // требуемые параметры
GostCipherSpec gostCipherSpec = new GostCipherSpec(new IvParameterSpec(agreementIV), pp);
cipher.init(Cipher.WRAP_MODE, secretKey);
byte[] wrappedCipherKey = cipher.wrap(cipherKey);
// Шифрование данных на симметричном ключе
cipher.init(Cipher.ENCRYPT_MODE, cipherKey, gostCipherSpec, null);
byte[] cipherIV = cipher.getIV();
byte[] encryptedData = cipher.doFinal(data);
// Создание CMS сообщения
OID contentInfoOID = new OID(CONTENT_INFO_OID);
contentInfo.contentType = new Asn1ObjectIdentifier(contentInfoOID.value);
EnvelopedData envelope = new EnvelopedData();
envelope.version = new CMSVersion(0);
contentInfo.content = envelope;
// Создание транспорта ключа
KeyTransRecipientInfo keyTransportInfo = new KeyTransRecipientInfo();
keyTransportInfo.version = new CMSVersion(0);
// Информация о сертификате получателя
X500Principal principal = recipientCertificate.getIssuerX500Principal();
RDNSequence rdnSequence = new RDNSequence();
decodeObject(rdnSequence, principal.getEncoded());
CertificateSerialNumber serial = new CertificateSerialNumber(recipientCertificate.getSerialNumber());
IssuerAndSerialNumber issuerAndSerial = new IssuerAndSerialNumber();
issuerAndSerial.issuer = new Name();
issuerAndSerial.issuer.set_rdnSequence(rdnSequence);
issuerAndSerial.serialNumber = serial;
keyTransportInfo.rid = new RecipientIdentifier();
keyTransportInfo.rid.set_issuerAndSerialNumber(issuerAndSerial);
// Информация об алгоритме
SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo();
decodeObject(publicKeyInfo, ephmeralPublicKey.getEncoded());
AlgIdInterface algorithmIdInterface = new AlgIdSpec(JCP.GOST_PARAMS_EXC_2012_256_KEY_OID);//publicKeyInfo.algorithm);
AlgorithmIdentifier algorithmId = (AlgorithmIdentifier)algorithmIdInterface.getDecoded();
keyTransportInfo.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
decodeObject(keyTransportInfo.keyEncryptionAlgorithm, encodeObject(algorithmId));
// Информация о транспорте ключа
GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
keyTransport.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
decodeObject(keyTransport.sessionEncryptedKey, wrappedCipherKey);
keyTransport.transportParameters = new GostR3410_TransportParameters();
int[] cipherOID = algorithmIdInterface.getCryptParams().getOID().value;
keyTransport.transportParameters.encryptionParamSet = new Gost28147_89_ParamSet(cipherOID);
keyTransport.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
decodeObject(keyTransport.transportParameters.ephemeralPublicKey, ephmeralPublicKey.getEncoded());
keyTransport.transportParameters.ukm = new Asn1OctetString(agreementIV);
keyTransportInfo.encryptedKey = new EncryptedKey(encodeObject(keyTransport));
// Создание получателя
envelope.recipientInfos = new RecipientInfos();
envelope.recipientInfos.elements = new RecipientInfo[1];
envelope.recipientInfos.elements[0] = new RecipientInfo();
envelope.recipientInfos.elements[0].set_ktri(keyTransportInfo);
// Создание контейнера шифрованных данных
envelope.encryptedContentInfo = new EncryptedContentInfo();
OID encryptedContentInfoOID = new OID(ENCRYPTED_CONTENT_INFO_OID);
envelope.encryptedContentInfo.contentType = new ContentType(encryptedContentInfoOID.value);
Gost28147_89_Parameters parameters = new Gost28147_89_Parameters();
parameters.iv = new Gost28147_89_IV(cipherIV);
int[] symmetricOID = symmetricParameters.getOID().value;
parameters.encryptionParamSet = new Gost28147_89_ParamSet(symmetricOID);
envelope.encryptedContentInfo.contentEncryptionAlgorithm = new ContentEncryptionAlgorithmIdentifier(_Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89, parameters);
envelope.encryptedContentInfo.encryptedContent = new EncryptedContent(encryptedData);
logger.debugT("[GostCipherHelper] envelope.encryptedContentInfo.encryptedConten = " + envelope.encryptedContentInfo.encryptedContent);
byte[] contentEncr = encodeObject(contentInfo);
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close