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

Уведомление

Icon
Error

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

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

Группы: Участники
Зарегистрирован: 10.04.2014(UTC)
Сообщений: 10
Откуда: Киев

Сказал(а) «Спасибо»: 1 раз
Помогите, пожалуйста, разобраться с шифрованием сообщения при помощи JCP.
На вход получаю byte[], подаю его на шифрование используя метод:

Код:

public byte[] Crypt(byte[] data, String Path_to_cert) throws Exception {   // String Path_to_cert путь к сертификату получтаеля
  //Загрузка хранилища
    final KeyStore hdImageStore = KeyStore.getInstance(CMStools.STORE_TYPE);
    hdImageStore.load(null, null);
    
    final PrivateKey senderKey =
            (PrivateKey) hdImageStore
                    .getKey(CMStools.SIGN_KEY_NAME, null);
    final X509Certificate publicSenderCert =
            (X509Certificate) hdImageStore
                    .getCertificate(CMStools.SIGN_KEY_NAME);
    
    //ключ получателя
    final X509Certificate publicCert =
            (X509Certificate) CMStools.readCertificate(Path_to_cert);
    /* Генерирование начальной синхропосылки для выработки ключа согласования*/
    final byte[] sv = new byte[RND_LENGTH];
    final SecureRandom random = SecureRandom.getInstance(Constants.RANDOM_ALG);
    random.nextBytes(sv);
    final IvParameterSpec ivspec = new IvParameterSpec(sv);
    
    final PublicKey responderPublic = publicCert.getPublicKey();
    
    /* Выработка ключа согласования алисы c SV*/
    final KeyAgreement senderKeyAgree =
            KeyAgreement.getInstance(CMStools.KEY_ALG_NAME);
    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);
    final SecretKey simm = kg.generateKey();
    
    /*Зашифрование текста на ключе согласования алисы*/
    Cipher cipher = Cipher.getInstance(CIPHER_ALG);
    cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);
    
    // передача вектора инициализации бобу
    final byte[] iv = cipher.getIV();
    final byte[] encryptedtext = cipher.doFinal(data, 0, data.length);
	
    
  //Зашифрование симметричного ключа на ключе согласования отправителя
    cipher.init(Cipher.WRAP_MODE, alisaSecret, (SecureRandom) null);
    final byte[] key = cipher.wrap(simm);
    
    
    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.getOID().value);
    cms.encryptedContentInfo.contentEncryptionAlgorithm =
            new ContentEncryptionAlgorithmIdentifier(
                    _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                    params);
    cms.encryptedContentInfo.encryptedContent = new EncryptedContent(encryptedtext);

    all.encode(ebuf);
    //Array.writeFile(CMS_FILE_PATH, ebuf.getMsgCopy());
    byte[] res = ebuf.getMsgCopy();
    CMStools.logger.info("ok");
    return res;
    
    
    //return encryptedtext;
} 


полученный результат записываю в файл, который пытаюсь расшифровать при помощи cryptcp, но получаю ошибку
Цепочки сертификатов проверены.
Расшифрование данных...
Ошибка: Встречено неверное значение тега ASN1.

Offline Евгений Афанасьев  
#2 Оставлено : 10 апреля 2014 г. 17:47:39(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
Здравствуйте.
С помощью какой команды проверяете в cryptcp?
Offline kvvn  
#3 Оставлено : 11 апреля 2014 г. 11:30:43(UTC)
kvvn

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

Группы: Участники
Зарегистрирован: 10.04.2014(UTC)
Сообщений: 10
Откуда: Киев

Сказал(а) «Спасибо»: 1 раз
Добрый день

Цитата:
Здравствуйте.
С помощью какой команды проверяете в cryptcp?


criptcp -decr -dn "Тут имя" -start file1.txt file2.txt

аналогичную ошибку получаю и при отправке на сервер, который должен будет проводить расшифровку в продуктиве.

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

Offline Евгений Афанасьев  
#4 Оставлено : 11 апреля 2014 г. 12:00:40(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
А с помощью csptest пробовали?
Примерно так: csptest -sfse -decrypt -in "in.enc" -out "result.out"
Offline kvvn  
#5 Оставлено : 11 апреля 2014 г. 12:15:20(UTC)
kvvn

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

Группы: Участники
Зарегистрирован: 10.04.2014(UTC)
Сообщений: 10
Откуда: Киев

Сказал(а) «Спасибо»: 1 раз
Цитата:
csptest -sfse -decrypt -in "in.enc" -out "result.out"


An error occurred in running the program.
.\ctmsg.c:638:Failed.
Error number 0x80093103 (2148086019).
Данные ASN1 повреждены.

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

Offline Евгений Афанасьев  
#6 Оставлено : 11 апреля 2014 г. 12:41:13(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
А что после зашифрования с данными делаете? В файл сохраняете - в der-кодировке?
Offline kvvn  
#7 Оставлено : 11 апреля 2014 г. 13:06:50(UTC)
kvvn

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

Группы: Участники
Зарегистрирован: 10.04.2014(UTC)
Сообщений: 10
Откуда: Киев

Сказал(а) «Спасибо»: 1 раз
сохраняю в файл:

Код:
public static void write(String fileName, String text) {
       
        File file = new File(fileName);
     
        try {
          
                file.createNewFile();
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fileName.txt")));
     
            try {
              
                out.write(text);
            } finally {
                out.close();
            }
        } catch(IOException e) {
            throw new RuntimeException(e);
        }

 

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

Offline Евгений Афанасьев  
#8 Оставлено : 11 апреля 2014 г. 14:18:28(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
А почему String text? Подпись ведь byte[]
Offline kvvn  
#9 Оставлено : 11 апреля 2014 г. 14:40:05(UTC)
kvvn

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

Группы: Участники
Зарегистрирован: 10.04.2014(UTC)
Сообщений: 10
Откуда: Киев

Сказал(а) «Спасибо»: 1 раз
Автор: afev Перейти к цитате
А почему String text? Подпись ведь byte[]

Метод вызываю так : write("somename.txt", new String(res)); где res результат шифрования.
Offline Евгений Афанасьев  
#10 Оставлено : 11 апреля 2014 г. 15:04:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
String дает строку в UTf-8, а вам надо бинарные данные. Например, Array.writeFile("my.file", bin_data), где Array - класс из ru.CryptoPro.JCP.tools.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
kvvn оставлено 11.04.2014(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.