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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline coldplay  
#1 Оставлено : 15 апреля 2016 г. 11:04:58(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Здравствуйте.
Используя пример из CMS_samples\CMSSignAndEncrypt шифрую данные и тут же их в тесте дешифрую для проверки. Дешифрую примером из cades и из CMS_samples\CMSDecrypt. Оба теста проходят успешно. Шифрованные данные сохраняются в файле. Когда пытаемся расшифровать полученный файл в криптоарм, получаем ошибку. В чем может быть проблема ?
КриптоАрм Стандарт 4 Сборка 4.6.1.1

Пример ошибки и кода:

Ошибка

Код:


   private CryptParamsSpec crp_params = CryptParamsSpec.getInstance(CryptParamsSpec.Rosstandart_TC26_Z);
    private java.lang.String pubKeyAlgorithm = JCP.GOST_DH_2012_512_NAME;
    private java.lang.String agreeAlgorithm = JCP.GOST_DH_2012_512_NAME;
    protected static final String CIPHER_MODE = "GOST28147/CFB/NoPadding";

@Test
    public void testEncrypt() throws Exception {
        String dataStr = "Lorem ipsum dolor sit amet";
        byte[] encData = encrypt(dataStr.getBytes());
        Array.writeFile(new File("/test3.txt.enc"), encData);

 //      byte[] decData = decryptExam(encData);
         byte[] decData = decrypt(encData);
        System.out.println(new String(decData));
        if (!Arrays.equals(dataStr.getBytes(), decData)) {
            throw new RuntimeException("!");
        }
    }

 public byte[] encrypt(byte[] data) {
        try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("test/test.cer");
             InputStream isResponder = this.getClass().getClassLoader().getResourceAsStream("test/responder/responder.cer")) {


            //ключ отправителя
            final PrivateKey senderKey = getSenderPrivateKey();

            final X509Certificate publicSenderCert = (X509Certificate) generateCert(is);


            //ключ получателя
            final X509Certificate publicCert = (X509Certificate) generateCert(isResponder);

            final PublicKey responderPublic = publicCert.getPublicKey();

            // выработка ключа согласования отправителем
            final KeyAgreement senderKeyAgree =
                    KeyAgreement.getInstance(agreeAlgorithm);
            senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
            senderKeyAgree.doPhase(responderPublic, true);
            final SecretKey alisaSecret =
                    senderKeyAgree.generateSecret(CMStools.SEC_KEY_ALG_NAME);

            // Генерирование симметричного ключа с параметрами шифрования из контрольной панели.
            final KeyGenerator kg = KeyGenerator.getInstance(CMStools.SEC_KEY_ALG_NAME);
            //final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
            kg.init(/*paramss*/ crp_params);
            final SecretKey simm = kg.generateKey();

            // Зашифрование текста на симметричном ключе.
            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(data, 0, data.length);

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

            //формирование CMS-сообщения
            final ContentInfo all = new ContentInfo();
            all.contentType =
                    new Asn1ObjectIdentifier(
                            new OID(CMStools.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 = publicCert.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(
                    publicCert.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(CMStools.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*/crp_params.getOID().value);
            cms.encryptedContentInfo.contentEncryptionAlgorithm =
                    new ContentEncryptionAlgorithmIdentifier(
                            _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                            params);
            cms.encryptedContentInfo.encryptedContent = new EncryptedContent(text);

            all.encode(ebuf);
            return ebuf.getMsgCopy();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

private byte[] decrypt(byte[] encData) {
        try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("test/responder/responder.cer")) {

            HDImageStore.setDir(this.getClass().getClassLoader().getResource("test/responder").getFile());
            KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");

            hdImageStore.load(null, null);
            //получатель - закрытый ключ
            final PrivateKey responderKey = (PrivateKey) hdImageStore.getKey("3da84419", "test".toCharArray());
            java.security.cert.Certificate cert = generateCert(is);


            ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
            EnvelopedSignature signature = null;
            signature = new EnvelopedSignature(new ByteArrayInputStream(encData));
            signature.decrypt((X509Certificate) cert, responderKey, decryptedByteDataStream);
            return decryptedByteDataStream.toByteArray();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public PrivateKey getSenderPrivateKey() {
        try {
            HDImageStore.setDir(this.getClass().getClassLoader().getResource("test").getFile());
            KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
            hdImageStore.load(null, null);
            final PrivateKey privateKey = (PrivateKey) hdImageStore.getKey("encr-test", "test".toCharArray());
            return privateKey;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }



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