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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline Ольга  
#11 Оставлено : 21 мая 2008 г. 17:48:01(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
Пример:
// данные для подписи и последющего шифрования
final byte[] data = "12345678".getBytes();
// вектор усложнения ключа согласования
final byte[] sv = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};

final KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);
//ключ отправителя
final PrivateKey senderKey =
(PrivateKey) hdImageStore.getKey("signkey", null);
final X509Certificate publicSenderCert =
(X509Certificate) hdImageStore.getCertificate("signkey");
//ключ получателя
final X509Certificate publicCert =
(X509Certificate) hdImageStore.getCertificate("recipkey");

//создание SignedData
final ContentInfo contentSign = new ContentInfo();
contentSign.contentType =
new Asn1ObjectIdentifier(new OID("1.2.840.113549.1.7.2").value);
final SignedData signedData = new SignedData();
contentSign.content = signedData;
signedData.version = new CMSVersion(1);
signedData.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(
new OID("1.2.643.2.2.9").value);
a.parameters = new Asn1Null();
signedData.digestAlgorithms.elements[0] = a;
signedData.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.1").value),
new Asn1OctetString(data));
signedData.certificates = new CertificateSet(1);
signedData.certificates.elements = new CertificateChoices[1];
final Certificate certificate = new Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(publicSenderCert.getEncoded());
certificate.decode(decodeBuffer);
signedData.certificates.elements[0] = new CertificateChoices();
signedData.certificates.elements[0].set_certificate(certificate);
final Signature signature = Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
signedData.signerInfos = new SignerInfos(1);
signature.initSign(senderKey);
signature.update(data);
final byte[] sign = signature.sign();
signedData.signerInfos.elements[0] = new SignerInfo();
signedData.signerInfos.elements[0].version = new CMSVersion(1);
signedData.signerInfos.elements[0].sid = new SignerIdentifier();

final byte[] encodedName =
publicSenderCert.getIssuerX500Principal()
.getEncoded();
final Asn1BerDecodeBuffer nameBuf =
new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);

final CertificateSerialNumber num = new CertificateSerialNumber(
publicSenderCert.getSerialNumber());
signedData.signerInfos.elements[0].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
signedData.signerInfos.elements[0].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID("1.2.643.2.2.9").value);
signedData.signerInfos.elements[0].digestAlgorithm.parameters =
new Asn1Null();
signedData.signerInfos.elements[0].signatureAlgorithm =
new SignatureAlgorithmIdentifier(
new OID("1.2.643.2.2.3").value);
signedData.signerInfos.elements[0].signatureAlgorithm.parameters =
new Asn1Null();
signedData.signerInfos.elements[0].signature = new SignatureValue(sign);

final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
contentSign.encode(asnBuf, true);

//данные для envelopedData
final byte[] buffer = asnBuf.getMsgCopy();

final PublicKey responderPublic = publicCert.getPublicKey();

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

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

// Зашифрование текста на симметричном ключе.
final Cipher cipher = Cipher.getInstance("GOST28147/CFB/NoPadding");
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);

//формирование CMS-сообщения
final ContentInfo all = new ContentInfo();
all.contentType =
new Asn1ObjectIdentifier(new OID("1.2.840.113549.1.7.3").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("1.2.840.113549.1.7.1");
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(text);

all.encode(ebuf);
Array.writeFile("E:\\signANDencrCMS.txt", ebuf.getMsgCopy());

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

Offline const  
#12 Оставлено : 22 мая 2008 г. 15:49:34(UTC)
const

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

Группы: Участники
Зарегистрирован: 19.05.2008(UTC)
Сообщений: 14
Откуда: Тольятти

Здравствуйте, огромное спасибо за пример, однако опробовать его не удалось.
во-первых, я не нашел где описаны классы

GostPublicKey
GostSecretKey

во-вторых, судя по применяемым в примере названиям методов (и некоторых классов) вы использовали не последнюю выложенную на сайте для скачки JCP 1.0.35. Так ли это?

еще раз спасибо за пример,
нет ли у вас примера дешифрования - проверки подписи CMS?

Offline Ольга  
#13 Оставлено : 22 мая 2008 г. 15:54:17(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
const написал:

названиям методов (и некоторых классов)

каких?
const написал:

нет ли у вас примера дешифрования - проверки подписи CMS?

примера нет, вы же хотели расшифровывать функцией CriptoApi.
Offline const  
#14 Оставлено : 22 мая 2008 г. 16:27:05(UTC)
const

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

Группы: Участники
Зарегистрирован: 19.05.2008(UTC)
Сообщений: 14
Откуда: Тольятти

я не нашел где описаны классы
GostPublicKey
GostSecretKey
где они??

Ольга написал:
const написал:

названиям методов (и некоторых классов)

каких?


например, вы применяли KeyAgreement.engineInit, если это класс KeyAgreement из javax.crypto (JDK 1.6), то у него нет такого метода engineInit, а есть метод init со схожими параметрами, и др.

Ольга написал:
const написал:

нет ли у вас примера дешифрования - проверки подписи CMS?

примера нет, вы же хотели расшифровывать функцией CriptoApi.


да, но все таки, необходимо может быть и обратная задача, приведите пример, пожалуйста
Offline Ольга  
#15 Оставлено : 22 мая 2008 г. 16:37:53(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
// выработка ключа согласования отправителем
final KeyAgreement senderKeyAgree = KeyAgreement.getInstance("GOST3410DH");
senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
senderKeyAgree.doPhase(responderPublic, true);
final SecretKey alisaSecret = senderKeyAgree.generateSecret("GOST28147");
Offline const  
#16 Оставлено : 22 мая 2008 г. 17:26:10(UTC)
const

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

Группы: Участники
Зарегистрирован: 19.05.2008(UTC)
Сообщений: 14
Откуда: Тольятти

Ольга написал:

...
keytrans.version = new CMSVersion(0);

final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
final AlgIdInterface algid =
(AlgIdInterface) ((GostPublicKey) responderPublic).getSpec().getParams();
final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
id.encode(ebuf);
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
keytrans.keyEncryptionAlgorithm.decode(dbuf);
...
...
cms.encryptedContentInfo = new EncryptedContentInfo();
final OID contentType = new OID("1.2.840.113549.1.7.1");
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((((GostSecretKey) simm).getSpec()).getParams().getOID().value);
......


где описаны эти классы?
GostSecretKey
GostPublicKey
Offline Ольга  
#17 Оставлено : 22 мая 2008 г. 19:58:19(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
исправила пример (см.выше)
Offline const  
#18 Оставлено : 26 мая 2008 г. 19:13:04(UTC)
const

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

Группы: Участники
Зарегистрирован: 19.05.2008(UTC)
Сообщений: 14
Откуда: Тольятти

Огромное спасибо за поддержку и терпение
Offline serega  
#19 Оставлено : 28 мая 2008 г. 0:07:50(UTC)
serega

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

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

Здравствуйте!

А примера дешифрации не появилось?

Может быть эти функции шифрации\дешифрации с использованием формата PKCS7 могут быть поддержаны на уровне JCP?

Спасибо.
Offline Ольга  
#20 Оставлено : 28 мая 2008 г. 15:14:41(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
// cms-сообщение для расшифрования
final byte[] buffer = Array.readFile("E:\\signANDencrCMS.txt");
//разбор CMS-сообщения
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(buffer);
final ContentInfo all = new ContentInfo();
all.decode(dbuf);
dbuf.reset();
final EnvelopedData cms = (EnvelopedData) all.content;

KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();
if (cms.recipientInfos.elements[0].getChoiceID() == RecipientInfo._KTRI)
keytrans =
(KeyTransRecipientInfo) (cms.recipientInfos.elements[0].getElement());
final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
dbuf = new Asn1BerDecodeBuffer(keytrans.encryptedKey.value);
final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
encrKey.decode(dbuf);
dbuf.reset();
encrKey.sessionEncryptedKey.encode(ebuf);
final byte[] wrapKey = ebuf.getMsgCopy();
ebuf.reset();
encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
final byte[] encodedPub = ebuf.getMsgCopy();
ebuf.reset();
final byte[] sv = encrKey.transportParameters.ukm.value;
final Gost28147_89_Parameters params =
(Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
final byte[] iv = params.iv.value;
final OID cipherOID = new OID(params.encryptionParamSet.value);
final byte[] text = cms.encryptedContentInfo.encryptedContent.value;

//Загрузка хранилища
final KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);
//получатель - закрытый ключ
final PrivateKey responderKey =
(PrivateKey) hdImageStore.getKey("recipkey", null);

//отправитель - открытый ключ из cms
final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
final KeyFactory kf = KeyFactory.getInstance("GOST3410DH");
final PublicKey senderPublic = kf.generatePublic(pspec);

// выработка ключа согласования получателем
final KeyAgreement responderKeyAgree = KeyAgreement.getInstance("GOST3410DH");
responderKeyAgree.init(responderKey, new IvParameterSpec(sv), null);
responderKeyAgree.doPhase(senderPublic, true);
final SecretKey responderSecret = responderKeyAgree
.generateSecret("GOST28147");

// Расшифрование симметричного ключа.
final Cipher cipher =Cipher.getInstance("GOST28147/CFB/NoPadding");
cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
final SecretKey simmKey = (SecretKey) cipher
.unwrap(wrapKey, null, Cipher.SECRET_KEY);

// Расшифрование текста на симметричном ключе.
final GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
cipher.init(Cipher.DECRYPT_MODE, simmKey, spec, null);
final byte[] result = cipher.doFinal(text, 0, text.length); //расшифрованные данные
// if result = signedData (signANDencrCMS) проверка подписи
CMSVerify.CMSVerify(result, null); // из samples CMS_samples

Отредактировано пользователем 3 июня 2008 г. 20:52:29(UTC)  | Причина: Не указана

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