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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline levandowskiy  
#1 Оставлено : 27 января 2014 г. 7:43:51(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Здравствуйте, уважаемые форумчане!

Есть следующая задача: Зашифровать zip-архив со следующими параметрами:

  1. Указать в качестве выходного формата PKCS#7 Message в DER-кодировке (должен получиться файл формата .p7m или .enc);
  2. В свойствах шифрования указать свой сертификат, а в списке сертификатов получателей выбрать сертификат X


Прошу вас указать, какие примеры из samples реализуют подобный функционал... Если таких примеров нет, то дайте хотя бы ссылку на мат. часть (RFC, стандарты...), где можно посмотреть, как это сделать.

И еще один вопрос в догонку: где можно почитать про p7m-формат.

Отредактировано пользователем 28 января 2014 г. 10:03:06(UTC)  | Причина: Дополнение

Offline levandowskiy  
#2 Оставлено : 3 февраля 2014 г. 8:02:47(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Написал следующий код для решения обозначенной в теме задачи. Функция DEREncoded2(String, X509Certificate, X509Certificate) шифрует zip-архив и генерирует файл p7m. Правда до этого дело не доходит так как при вызове функции вылетает java.security.InvalidKeyException на строке, помеченной комментарием (// вот здесь вылетает исключение)

Код:

    public static final void DEREncoded2(String path,
            java.security.cert.X509Certificate publicSenderCert,
            java.security.cert.X509Certificate responderCert) throws IOException,
            Asn1Exception, CertificateEncodingException, NoSuchAlgorithmException,
            InvalidKeyException, SignatureException, InvalidAlgorithmParameterException,
            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        
        byte[] buffer = Array.readFile(path);
        KeyPair ephemerialPair = generateKeyPair(JCP.GOST_DEGREE_NAME);
        
        PublicKey publicKey = responderCert.getPublicKey();
        KeyAgreement senderKeyAgree = KeyAgreement.getInstance(JCP.GOST_DH_NAME);
//        byte[] sv = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
        senderKeyAgree.init(ephemerialPair.getPrivate(), new IvParameterSpec(sv), null); // вот здесь вылетает исключение
        senderKeyAgree.doPhase(publicKey, true);
        SecretKey agreementKey = senderKeyAgree.generateSecret(CryptoProvider.GOST_CIPHER_NAME);
        
        KeyGenerator kg = KeyGenerator.getInstance(CryptoProvider.GOST_CIPHER_NAME);
        ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
        kg.init(paramss);
        SecretKey randomSymmKey = kg.generateKey();
        byte[] key = encryptKey("GOST28147/CFB/NoPadding", randomSymmKey, agreementKey);
        Cipher cip = Cipher.getInstance("GOST28147/CFB/NoPadding");
        cip.init(Cipher.ENCRYPT_MODE, randomSymmKey, (SecureRandom) null);
        byte[] iv = cip.getIV();
        byte[] cipher = cip.doFinal(buffer, 0, buffer.length);

        /* Формирование CMS-сообщения */
        final ContentInfo all = new ContentInfo();
        all.contentType
                = new Asn1ObjectIdentifier(new OID(STR_CMS_OID_ENVELOPED).value);
        final EnvelopedData cms = new EnvelopedData();
        all.content = cms;

        cms.version = new CMSVersion(0);

        cms.recipientInfos = new RecipientInfos(1);
        cms.recipientInfos.elements = new RecipientInfo[1];
        cms.recipientInfos.elements[0] = new RecipientInfo();

        final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();

        keytrans.version = new CMSVersion(0);

        final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
        final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
        final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
                publicSenderCert.getPublicKey().getEncoded());
        spki.decode(dbuff);
        dbuff.reset();
        final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
        final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
        id.encode(ebuf);
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
        keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
        keytrans.keyEncryptionAlgorithm.decode(dbuf);
        ebuf.reset();
        dbuf.reset();
        keytrans.rid = new RecipientIdentifier();
        final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
        final X500Principal issuerName = responderCert.getIssuerX500Principal();
        dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
        issuer.issuer = new Name();
        final RDNSequence rnd = new RDNSequence();
        rnd.decode(dbuf);
        issuer.issuer.set_rdnSequence(rnd);
        issuer.serialNumber = new CertificateSerialNumber(
                responderCert.getSerialNumber());
        keytrans.rid.set_issuerAndSerialNumber(issuer);
        dbuf.reset();
        final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
        dbuf = new Asn1BerDecodeBuffer(key);
        encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
        encrKey.sessionEncryptedKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters = new GostR3410_TransportParameters();
        encrKey.transportParameters.encryptionParamSet
                = new Gost28147_89_ParamSet(algid.getCryptParams()
                        .getOID().value);
        encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
        dbuf = new Asn1BerDecodeBuffer(
                publicSenderCert.getPublicKey().getEncoded());
        encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters.ukm = new Asn1OctetString(sv);
        encrKey.encode(ebuf);
        keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
        ebuf.reset();
        cms.recipientInfos.elements[0].set_ktri(keytrans);

        cms.encryptedContentInfo = new EncryptedContentInfo();
        final OID contentType = new OID(STR_CMS_OID_DATA);
        cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
        final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
        params.iv = new Gost28147_89_IV(iv);
        params.encryptionParamSet
                = new Gost28147_89_ParamSet(paramss.getOID().value);
        cms.encryptedContentInfo.contentEncryptionAlgorithm
                = new ContentEncryptionAlgorithmIdentifier(
                        _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                        params);
        cms.encryptedContentInfo.encryptedContent = new EncryptedContent(cipher);

        all.encode(ebuf);

        Array.writeFile(path + ".p7m", ebuf.getMsgCopy());
    }


Функция generateKeyPair:
Код:

    public static final KeyPair generateKeyPair(String algorithm)
            throws NoSuchAlgorithmException {
        final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm);
        return keyGen.generateKeyPair();
    }


Вот стектрейс исключения:
Код:

03.02.2014 9:53:55 ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
03.02.2014 9:53:55 ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
03.02.2014 9:53:59 ru.CryptoPro.Crypto.Key.KeyAgreement engineInit
WARNING: Параметры ключа не соответствуют алгоримам подписи ГОСТ и обмена Диффи-Хелмана
java.security.InvalidKeyException: Параметры ключа не соответствуют алгоримам подписи ГОСТ и обмена Диффи-Хелмана
	at ru.CryptoPro.Crypto.Key.KeyAgreement.engineInit(Unknown Source)
	at javax.crypto.KeyAgreement.a(DashoA13*..)
	at javax.crypto.KeyAgreement.a(DashoA13*..)
	at javax.crypto.KeyAgreement.init(DashoA13*..)
	at org.cashcom.nbch.utilities.CryptoProUtilities.DEREncoded2(CryptoProUtilities.java:708)
	at org.cashcom.nbch.utilities.CryptoProUtilities.main(CryptoProUtilities.java:1058)
Exception in thread "main" java.security.InvalidKeyException: Параметры ключа не соответствуют алгоримам подписи ГОСТ и обмена Диффи-Хелмана
	at ru.CryptoPro.Crypto.Key.KeyAgreement.engineInit(Unknown Source)
	at javax.crypto.KeyAgreement.a(DashoA13*..)
	at javax.crypto.KeyAgreement.a(DashoA13*..)
	at javax.crypto.KeyAgreement.init(DashoA13*..)
	at org.cashcom.nbch.utilities.CryptoProUtilities.DEREncoded2(CryptoProUtilities.java:708)
	at org.cashcom.nbch.utilities.CryptoProUtilities.main(CryptoProUtilities.java:1058)
Java Result: 1
BUILD SUCCESSFUL (total time: 6 seconds)


Подскажите, пожалуйста, о каком несоответствии параметров ключа идет речь и что необходимо исправить?
Offline Евгений Афанасьев  
#3 Оставлено : 3 февраля 2014 г. 8:52:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 701 раз в 662 постах
Алгоритм в generateKeyPair(String algorithm) должен быть "GOST3410DH" (CryptoProvider.GOST_DH_NAME) или "GOST3410DHEPH" (CryptoProvider.GOST_EPH_DH_NAME).

Отредактировано пользователем 3 февраля 2014 г. 8:55:41(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
levandowskiy оставлено 03.02.2014(UTC)
Offline levandowskiy  
#4 Оставлено : 10 февраля 2014 г. 7:47:23(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Получил на выходе заветный p7m, но на стороне получателя не могут его расшифровать. Думаю, что проблема, либо с моим шифрованием, либо с формированием cms-сообщения.
Так как шифровать нужно на сертификате получателя, то шифрую так:

  1. Генерирую эфемерную ключевую пару
  2. Генерирую ключ согласования из эфемерного закрытого и сертификата получателя
  3. Создаю случайный секретный ключ
  4. Шифрую секретный ключ на ключе согласования
  5. Шифрую данные случайным секретным ключом


А дальше формирую CMS-сообщение как в CMSSignAndEncrypt из Samples/sample-sources/CMS_samples.

Вот код моей функции шифрования и получения p7m, а также всех используемых в ней функций:
Код:

public static final void DEREncoded2(String path,
		java.security.cert.X509Certificate publicSenderCert,
		java.security.cert.X509Certificate responderCert) throws IOException,
		Asn1Exception, CertificateEncodingException, NoSuchAlgorithmException,
		InvalidKeyException, SignatureException, InvalidAlgorithmParameterException,
		NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
	
	/* Получил данные для шифрования */
	byte[] buffer = Array.readFile(path);
	
	/* Сгенерировал эфемерную пару ключей */
	KeyPair ephemerialPair = generateKeyPair(CryptoProvider.GOST_EPH_DH_NAME);
	
	/* Сгенерировал ключ согласования из эфемерного закрытого и сертификата получателя */
	// sv = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
	SecretKey agreementKey = generateAgreementKey(ephemerialPair.getPrivate(), responderCert, sv);

	/* Взял параметры из контрольной панели (по-умолчанию) */
	ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
	
	/* Создал секретный ключ с параметрами из контрольной панели */
	SecretKey randomSymmKey = generateSymmetricKey();
	
	/* Зашифровал секретный ключ на ключе согласования */
	byte[] key = encryptKey("GOST28147/CFB/NoPadding", randomSymmKey, agreementKey);
	
	/* И, наконец, шифрую данные */
	Cipher cip = Cipher.getInstance("GOST28147/CFB/NoPadding");
	cip.init(Cipher.ENCRYPT_MODE, randomSymmKey, (SecureRandom) null);
	byte[] iv = cip.getIV();
	byte[] cipher = cip.doFinal(buffer, 0, buffer.length);

	/* Формирование CMS-сообщения */
	final ContentInfo all = new ContentInfo();
	all.contentType
			= new Asn1ObjectIdentifier(new OID(STR_CMS_OID_ENVELOPED).value);
	final EnvelopedData cms = new EnvelopedData();
	all.content = cms;

	cms.version = new CMSVersion(0);

	cms.recipientInfos = new RecipientInfos(1);
	cms.recipientInfos.elements = new RecipientInfo[1];
	cms.recipientInfos.elements[0] = new RecipientInfo();

	final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();

	keytrans.version = new CMSVersion(0);

	final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
	final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
	final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
			publicSenderCert.getPublicKey().getEncoded());
	spki.decode(dbuff);
	dbuff.reset();
	final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
	final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
	id.encode(ebuf);
	Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
	keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
	keytrans.keyEncryptionAlgorithm.decode(dbuf);
	ebuf.reset();
	dbuf.reset();
	keytrans.rid = new RecipientIdentifier();
	final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
	final X500Principal issuerName = responderCert.getIssuerX500Principal();
	dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
	issuer.issuer = new Name();
	final RDNSequence rnd = new RDNSequence();
	rnd.decode(dbuf);
	issuer.issuer.set_rdnSequence(rnd);
	issuer.serialNumber = new CertificateSerialNumber(
			responderCert.getSerialNumber());
	keytrans.rid.set_issuerAndSerialNumber(issuer);
	dbuf.reset();
	final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
	dbuf = new Asn1BerDecodeBuffer(key);
	encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
	encrKey.sessionEncryptedKey.decode(dbuf);
	dbuf.reset();
	encrKey.transportParameters = new GostR3410_TransportParameters();
	encrKey.transportParameters.encryptionParamSet
			= new Gost28147_89_ParamSet(algid.getCryptParams()
					.getOID().value);
	encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
	dbuf = new Asn1BerDecodeBuffer(
			publicSenderCert.getPublicKey().getEncoded());
	encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
	dbuf.reset();
	encrKey.transportParameters.ukm = new Asn1OctetString(sv);
	encrKey.encode(ebuf);
	keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
	ebuf.reset();
	cms.recipientInfos.elements[0].set_ktri(keytrans);

	cms.encryptedContentInfo = new EncryptedContentInfo();
	final OID contentType = new OID(STR_CMS_OID_DATA);
	cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
	final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
	params.iv = new Gost28147_89_IV(iv);
	params.encryptionParamSet
			= new Gost28147_89_ParamSet(paramss.getOID().value);
	cms.encryptedContentInfo.contentEncryptionAlgorithm
			= new ContentEncryptionAlgorithmIdentifier(
					_Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
					params);
	cms.encryptedContentInfo.encryptedContent = new EncryptedContent(cipher);

	all.encode(ebuf);

	Array.writeFile(path + ".p7m", ebuf.getMsgCopy());
}

public static final SecretKey generateAgreementKey(Key senderKey,
		Certificate responderCertificate, byte[] startVector)
		throws NoSuchAlgorithmException, InvalidKeyException,
		InvalidAlgorithmParameterException {

	/* Ключ обмена, соответствующий закрытому ключу */
	PublicKey publicKey = responderCertificate.getPublicKey();

	/* создание генератора ключей согласования */
	KeyAgreement senderKeyAgree = KeyAgreement.getInstance(JCP.GOST_DH_NAME);

	/* Инициализация генератора ключей согласования */
	senderKeyAgree.init(senderKey, new IvParameterSpec(startVector), null);

	/* Фаза согласования открытого и закрытого ключей */
	senderKeyAgree.doPhase(publicKey, true);

	/* Генерация ключа согласования */
	return senderKeyAgree.generateSecret(CryptoProvider.GOST_CIPHER_NAME);
}

public static final SecretKey generateSymmetricKey(ParamsInterface... params)
		throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {

	/* Создание генератора симметричных ключей шифрования */
	KeyGenerator kg = KeyGenerator.getInstance(CryptoProvider.GOST_CIPHER_NAME);

	/* Установка параметров шифрования */
	kg.init(params.length == 0 ? AlgIdSpec.getDefaultCryptParams() : params[0]);

	/* Генерация симметричного ключа шифрования */
	return kg.generateKey();
}

public static final byte[] encryptKey(String cipherMode, SecretKey toEncrypt,
		SecretKey byEncrypt) throws NoSuchAlgorithmException,
		NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException {

	/* Получение экземпляра шифратора */
	Cipher cipher = Cipher.getInstance(cipherMode);

	/* Инициализация шифратора в режиме шифрования ключей */
	cipher.init(Cipher.WRAP_MODE, toEncrypt, (SecureRandom) null);

	/* Шифрование ключа */
	return cipher.wrap(byEncrypt);
}

public static final KeyPair generateKeyPair(String algorithm)
		throws NoSuchAlgorithmException {
	final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm);
	return keyGen.generateKeyPair();
}


Подскажите пожалуйста по правильному ли алгоритму я шифрую данные или шифрование на сертификате выполняется как-либо по-другому?
Согласно какому RFC формируются p7m-файлы и обоснованно ли считать, что это те же CMS как в RFC 5652?
Конечно, был бы очень признателен, если бы вы указали на ошибки в коде, но особо на это не надеюсь.
Offline Евгений Афанасьев  
#5 Оставлено : 10 февраля 2014 г. 9:05:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 701 раз в 662 постах
Возможно, у вас с вектором что-то не то: byte[] iv = cip.getIV();
Посмотрите еще раз пример, вектор получают после зашифрования данных до зашифрования симм. ключа:
Код:

final Cipher cipher = Cipher.getInstance(CIPHER_MODE);
cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);
final byte[] iv = cipher.getIV();
final byte[] text = cipher.doFinal(buffer, 0, buffer.length);

//Зашифрование симметричного ключа на ключе согласования отправителя
cipher.init(Cipher.WRAP_MODE, alisaSecret, (SecureRandom) null);
final byte[] key = cipher.wrap(simm);

Отредактировано пользователем 10 февраля 2014 г. 9:38:41(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
levandowskiy оставлено 11.02.2014(UTC)
Offline levandowskiy  
#6 Оставлено : 10 февраля 2014 г. 12:37:52(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Автор: afev Перейти к цитате
Возможно, у вас с вектором что-то не то: byte[] iv = cip.getIV();
Посмотрите еще раз пример, вектор получают после зашифрования данных до зашифрования симм. ключа:
Код:

final Cipher cipher = Cipher.getInstance(CIPHER_MODE);
cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);
final byte[] iv = cipher.getIV();
final byte[] text = cipher.doFinal(buffer, 0, buffer.length);

//Зашифрование симметричного ключа на ключе согласования отправителя
cipher.init(Cipher.WRAP_MODE, alisaSecret, (SecureRandom) null);
final byte[] key = cipher.wrap(simm);




Вектор переставил на место как в примере, получилось следующее:
Код:
public static final void DEREncoded2(String path,
            java.security.cert.X509Certificate publicSenderCert,
            java.security.cert.X509Certificate responderCert) throws IOException,
            Asn1Exception, CertificateEncodingException, NoSuchAlgorithmException,
            InvalidKeyException, SignatureException, InvalidAlgorithmParameterException,
            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {

        byte[] buffer = Array.readFile(path);
        KeyPair ephemerialPair = generateKeyPair(CryptoProvider.GOST_EPH_DH_NAME);
        SecretKey agreementKey = generateAgreementKey(ephemerialPair.getPrivate(), responderCert, sv);

        ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
        SecretKey randomSymmKey = generateSymmetricKey();
        Cipher cip = Cipher.getInstance("GOST28147/CFB/NoPadding");
        cip.init(Cipher.ENCRYPT_MODE, randomSymmKey, (SecureRandom) null);
        byte[] iv = cip.getIV();
        byte[] cipher = cip.doFinal(buffer, 0, buffer.length);
        byte[] key = encryptKey("GOST28147/CFB/NoPadding", randomSymmKey, agreementKey);

        /* Формирование CMS-сообщения */
        final ContentInfo all = new ContentInfo();
        all.contentType
                = new Asn1ObjectIdentifier(new OID(STR_CMS_OID_ENVELOPED).value);
        final EnvelopedData cms = new EnvelopedData();
        all.content = cms;

        cms.version = new CMSVersion(0);

        cms.recipientInfos = new RecipientInfos(1);
        cms.recipientInfos.elements = new RecipientInfo[1];
        cms.recipientInfos.elements[0] = new RecipientInfo();

        final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();

        keytrans.version = new CMSVersion(0);

        final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
        final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
        final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
                publicSenderCert.getPublicKey().getEncoded());
        spki.decode(dbuff);
        dbuff.reset();
        final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
        final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
        id.encode(ebuf);
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
        keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
        keytrans.keyEncryptionAlgorithm.decode(dbuf);
        ebuf.reset();
        dbuf.reset();
        keytrans.rid = new RecipientIdentifier();
        final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
        final X500Principal issuerName = responderCert.getIssuerX500Principal();
        dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
        issuer.issuer = new Name();
        final RDNSequence rnd = new RDNSequence();
        rnd.decode(dbuf);
        issuer.issuer.set_rdnSequence(rnd);
        issuer.serialNumber = new CertificateSerialNumber(
                responderCert.getSerialNumber());
        keytrans.rid.set_issuerAndSerialNumber(issuer);
        dbuf.reset();
        final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
        dbuf = new Asn1BerDecodeBuffer(key);
        encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
        encrKey.sessionEncryptedKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters = new GostR3410_TransportParameters();
        encrKey.transportParameters.encryptionParamSet
                = new Gost28147_89_ParamSet(algid.getCryptParams()
                        .getOID().value);
        encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
        dbuf = new Asn1BerDecodeBuffer(
                publicSenderCert.getPublicKey().getEncoded());
        encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters.ukm = new Asn1OctetString(sv);
        encrKey.encode(ebuf);
        keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
        ebuf.reset();
        cms.recipientInfos.elements[0].set_ktri(keytrans);

        cms.encryptedContentInfo = new EncryptedContentInfo();
        final OID contentType = new OID(STR_CMS_OID_DATA);
        cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
        final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
        params.iv = new Gost28147_89_IV(iv);
        params.encryptionParamSet
                = new Gost28147_89_ParamSet(paramss.getOID().value);
        cms.encryptedContentInfo.contentEncryptionAlgorithm
                = new ContentEncryptionAlgorithmIdentifier(
                        _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                        params);
        cms.encryptedContentInfo.encryptedContent = new EncryptedContent(cipher);

        all.encode(ebuf);

        Array.writeFile(path + ".p7m", ebuf.getMsgCopy());
    }


Однако, все равно получаю ответ о невозможности расшифровать сообщение.
Подскажите, как же все-таки правильно шифровать на сертификате по ГОСТ? Есть подозрение, что неправильно формируется само CMS-сообщение. Отсюда, еще несколько вопросов: есть ли примеры формирования именно p7m-файлов?
Offline Евгений Афанасьев  
#7 Оставлено : 10 февраля 2014 г. 12:48:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 701 раз в 662 постах
У вас ошибка расшифрования или уже проверки подписи (после расшифрования)?
Попробуйте сначала выполнить задачу. используя пример в исходном его виде.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
levandowskiy оставлено 11.02.2014(UTC)
Offline levandowskiy  
#8 Оставлено : 10 февраля 2014 г. 12:57:12(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Автор: afev Перейти к цитате
У вас ошибка расшифрования или уже проверки подписи (после расшифрования)?
Попробуйте сначала выполнить задачу. используя пример в исходном его виде.


Судя по тому, что отвечает НБКИ ошибка связана с шифрованием.
Вот посмотрите сами:

Код:

Сообщение 006. Ошибка расшифровки файла. Проверьте, что файл зашифрован в формате DER и на оператора НБКИ, и сертификат не просрочен.
Message 006. File decryption error. File encryption encoding must be DER, the file must be encrypted with NBCH-operator certificate and the certificate must be valid.


Код:

ReceiveDateTime	 20140210122329041
Name check result	 OK
Decryption result	 FAIL
Extract result	 NO DATA
Signature check result	 NO DATA
Format check result	 
AcceptedRecords	 
LoadedRecords	 
RejectedRecords	 
RejectFile	 
OriginalFileHash	


Это то что я получаю в ответ

Отредактировано пользователем 10 февраля 2014 г. 12:57:58(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#9 Оставлено : 10 февраля 2014 г. 13:48:13(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 701 раз в 662 постах
Попробуйте отладить на примере csptest или cryptcp с JCP - в одном зашифровать, в другом - расшифровать.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
levandowskiy оставлено 11.02.2014(UTC)
Offline levandowskiy  
#10 Оставлено : 11 февраля 2014 г. 7:21:53(UTC)
levandowskiy

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

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

Сказал(а) «Спасибо»: 14 раз
Автор: afev Перейти к цитате
Попробуйте отладить на примере csptest или cryptcp с JCP - в одном зашифровать, в другом - расшифровать.


cryptcp, как я понимаю - это утилита для командной строки. А вот про csptest я в первый раз слышу.

Не могли бы вы пояснить, что это за программа такая? А также (возможно скинуть ссылку) ее стоимость? cryptcp для Windows, как я понимаю, тоже платная (не входит в пакет КриптоПро CSP), тоже хотелось бы узнать ее стоимость?

Также не могли бы вы подсказать где взять пользовательскую документацию по указанным утилитам?

Отредактировано пользователем 11 февраля 2014 г. 7:31:21(UTC)  | Причина: Не указана

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