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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline RKoryakov  
#1 Оставлено : 27 марта 2019 г. 19:50:25(UTC)
RKoryakov

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

Группы: Участники
Зарегистрирован: 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);

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