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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline stash  
#1 Оставлено : 27 апреля 2010 г. 16:24:50(UTC)
stash

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

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

Здравствуйте,
у меня, наверное, очень простой вопрос, как написано в теме, необходимо зашифровать бинарный файл с помощью "PKCS#7 Message" (в файл p7m), для этого, как написано необходимо задействовать сертификат. Реализую я это на Java, использовать пробую и JCP и BC :) и пока все не очень удачно.
К сожалению, я плохо разбираюсь в шифровании, но после того как я просмотрел почти все исходники на google/codesearch и здесь, все что связано с почтовыми p7m и PKCS7, я пришел к выводу, что зашифровать файл, используя только сертификат невозможно, что нужно еще генерировать ключ. Не мог бы мне кто-нибудь помочь, действительно ли можно зашифровать файл используя только сертификат?
В примерах КриптоПро я разбирался с файлом Encrypt.java, но, к сожалению в этом примере помимо шифрования файла - генерируется туча ключей, я пробовал сократить количество ключей до минимума, но все равно секретный ключ остается и получается, что одним сертификатом я не обошелся.

Отредактировано пользователем 27 апреля 2010 г. 16:41:18(UTC)  | Причина: Не указана

Offline stash  
#2 Оставлено : 28 апреля 2010 г. 14:25:14(UTC)
stash

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

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

Ну как я понял, чтобы зашифровать данные в "PKCS7 Message" нужно действовать по другому. Теперь вопрос, собственно, в том, может ли быть ошибка из-за того, что сертификат не тот, который требуется?
вот пример кода:
Код:

KeyStore    ks = KeyStore.getInstance("HDImageStore");
ks.load(new FileInputStream("C:\\root\\sdk\\jdk1.6.0_20\\bin\\test.jks"), "test".toCharArray());
SMIMEEnvelopedGenerator  gen = new SMIMEEnvelopedGenerator();
X509Certificate cert = (X509Certificate)ks.getCertificate("test");
gen.addKeyTransRecipient(cert);
MimeBodyPart    msg = new MimeBodyPart();
msg.setText("Hello world!");
MimeBodyPart mp = gen.generate(msg,  SMIMEEnvelopedGenerator.RC2_CBC , "BC");
...

и на этой строчке вызывается исключение,
Код:

org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$WrappingIOException: org.bouncycastle.cms.CMSException: error making encrypted content.
	at org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$ContentEncryptor.write(SMIMEEnvelopedGenerator.java:330)
	at org.bouncycastle.mail.smime.handlers.PKCS7ContentHandler.writeTo(PKCS7ContentHandler.java:98)
	at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:869)
	at javax.activation.DataHandler.writeTo(DataHandler.java:302)
	at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1383)
	at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1743)
	at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1719)
	at org.sts.util.crypt.MailCrypt.encrypt2MIME(MailCrypt.java:123)
	at org.zenit.nbki.ckki.CKKI.main(CKKI.java:414)
Caused by: org.bouncycastle.cms.CMSException: error making encrypted content.
	at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(CMSEnvelopedDataStreamGenerator.java:169)
	at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(CMSEnvelopedDataStreamGenerator.java:296)
	at org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$ContentEncryptor.write(SMIMEEnvelopedGenerator.java:298)
	... 8 more
Caused by: java.security.NoSuchAlgorithmException: No such algorithm: 1.2.643.2.2.19
	at javax.crypto.Cipher.getInstance(DashoA13*..)
	at javax.crypto.Cipher.getInstance(DashoA13*..)
	at org.bouncycastle.cms.CMSEnvelopedHelper.createAsymmetricCipher(CMSEnvelopedHelper.java:55)
	at org.bouncycastle.cms.CMSEnvelopedGenerator$RecipientInf.toRecipientInfo(CMSEnvelopedGenerator.java:261)
	at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(CMSEnvelopedDataStreamGenerator.java:157)
	... 10 more

этот алгоритм "1.2.643.2.2.19" - ГОСТ3410, и в сертификате написано, что открытый ключ ГОСТ3410
Offline stash  
#3 Оставлено : 29 апреля 2010 г. 20:48:26(UTC)
stash

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

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

нет, это тоже был неверный вариант, сертификат тот, нужно просто сделать действие, эквивалентное команде cryptcp
Код:

cryptcp -encr -der -f "c:\test.cer" file.zipl file.encr.message

может кто-то знает ссылки на документацию соответствующую. C bouncy CMSEvelopedDataGenerator возникает ошибка "KeyGenerator not available для ГОСТ 3410_2001"
Offline Iva  
#4 Оставлено : 5 мая 2010 г. 13:11:33(UTC)
Iva

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

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

Термин «шифрование на сертификате» происходит из алгоритма RSA. Там можно зашифровать сообщение на сертификате получателя, так чтоб он своим закрытым ключом его расшифровал. С российскими алгоритмами так нельзя. Для эмуляции шифрования на сертификате можно использовать такую схему.
1. Сначала надо создать эфемерную ключевую пару.
2. Потом выработать ключ согласования из эфемерного закрытого и сертификата получателя.
3. Создать случайный секретный ключ шифрования.
4. Этот секретный ключ зашифровать на ключе согласования.
5. Данные шифровать случайным секретным ключом.
6. Отправить получателю зашифрованные данные, зашифрованный секретный ключ и открытый ключ или его сертификат.
Т.е. стандартная схема, как в примерах, только ключевая пара не постоянная, а эфемерная, одноразовая. Эта схема позволяет шифровать сообщение для пользователя имея только его сертификат. Он сможет его расшифровать, но не будет гарантированно знать, от кого оно пришло, может и от противника. Если создавать вместо эфемерной пары пользовательский постоянный ключ с сертификатом, то вся схема сохранится, но получатель сможет гарантированно назвать отправителя.
Offline stash  
#5 Оставлено : 5 мая 2010 г. 22:03:20(UTC)
stash

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

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

большое спасибо
тогда не совсем понятно - cryptcp.exe так и поступает? он не требовал ключа при шифровании а с указываемым сертификатом не было связано закрытых ключей

Отредактировано пользователем 6 мая 2010 г. 12:01:46(UTC)  | Причина: Не указана

Offline Iva  
#6 Оставлено : 13 мая 2010 г. 13:50:07(UTC)
Iva

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

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

Чтоб не появлялся биодатчик при создании эфемерной пары ключей
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm);
В качестве алгоритма надо указывать не "GOST3410DH", а "GOST3410DHEPH"
Секретный ключ из такой ключевой пары нельзя использовать как пользовательский
и нельзя сохранить в хранилище, во всем остальном он такой же.
Offline Darryl  
#7 Оставлено : 25 августа 2011 г. 22:16:55(UTC)
Darryl

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

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

Именно эта схема с эфемерной ключевой парой реализована в консольном приложении CryptCP ?
Offline ThinkingAnna  
#8 Оставлено : 5 декабря 2017 г. 13:24:58(UTC)
ThinkingAnna

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

Группы: Участники
Зарегистрирован: 19.05.2015(UTC)
Сообщений: 41
Женщина
Российская Федерация

Сказала «Спасибо»: 4 раз
Добрый день! Подскажите, пожалуйста.

Используем эмуляцию шифрования на сертификате с эфимерной ключевой парой.

Цитата:

Чтоб не появлялся биодатчик при создании эфемерной пары ключей
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm);
В качестве алгоритма надо указывать не "GOST3410DH", а "GOST3410DHEPH"
Секретный ключ из такой ключевой пары нельзя использовать как пользовательский
и нельзя сохранить в хранилище, во всем остальном он такой же.


На JCP 1.0.54 все работает как надо. Перешли на версию JCP 2.0
И там GOST3410DHEPH KeyPairGenerator not available

Я правильно понимаю, что нужно использовать
"GOST3410DHELEPH" (т.е. JCP.GOST_EL_DH_EPH_NAME)?
Offline Евгений Афанасьев  
#9 Оставлено : 5 декабря 2017 г. 13:31:17(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Добрый день.
Да, В версии 2.0 часть старых алгоритмов, классов и т.п. была удалена, рабочие алгоритмы описаны в документации (руководство программиста).
Автор: ThinkingAnna Перейти к цитате
Я правильно понимаю, что нужно использовать
"GOST3410DHELEPH" (т.е. JCP.GOST_EL_DH_EPH_NAME)?

Да.

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