Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.02.2016(UTC) Сообщений: 60
Сказал(а) «Спасибо»: 18 раз Поблагодарили: 2 раз в 2 постах
|
Для шифрования данных использовал пример из пакета Crypt_samples. Заказчик сменил сертификат на новый в котором из key usage пропал KeyAgreement. В примерах шифрование идет как раз таки с использованием KeyAgreement . Есть ли пример шифрования без использования ключа согласования ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,004 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Какой пример использовали? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.02.2016(UTC) Сообщений: 60
Сказал(а) «Спасибо»: 18 раз Поблагодарили: 2 раз в 2 постах
|
Пример взят из CMS_samples. Код:public byte[] encrypt(byte[] data, X509Certificate responderPublicCert, KeyPair keyPair) {
try {
KeyPair kp = keyPair;
PrivateKey senderKey = kp.getPrivate();
// выработка ключа согласования отправителем
final KeyAgreement senderKeyAgree =
KeyAgreement.getInstance(responderPublicCert.getPublicKey().getAlgorithm());
senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
senderKeyAgree.doPhase(responderPublicCert.getPublicKey(), true);
final SecretKey secretKey =
senderKeyAgree.generateSecret("GOST28147");
// Генерирование симметричного ключа с параметрами шифрования из контрольной панели.
final KeyGenerator kg = KeyGenerator.getInstance("GOST28147");
//final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
kg.init(AlgIdSpec.getDefaultCryptParams());
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, secretKey, (SecureRandom) null);
final byte[] key = cipher.wrap(simm);
//формирование 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(
kp.getPublic().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 = responderPublicCert.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(
responderPublicCert.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(AlgIdSpec.getDefaultCryptParams().getOID().value);
encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
dbuf = new Asn1BerDecodeBuffer(
kp.getPublic().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(AlgIdSpec.getDefaultCryptParams().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);
}
}
Алгоритм для генерации пары ключей берется из публичного ключа получателя. Раньше там был GOST3410EL. К нему прибавляли префикс EPH и генерили пару для шифрования. Все работало. Потом получатель перевыпустил сертификат. В новом алгоритм GOST3410_2012_512 и в нем отсутсвует разрешение на Key Agreement. Использовал алгоритм с префиксами dh и eth (GOST3410DHEPH_2012_512). Метод стал работать и шифровать сообщение. Но получатель не смог его расшифровать. Теперь не очень понятно, что делать дальше. UPD использовал пример поактуальнее, с более корректным использованием CryptParamsSpec Отредактировано пользователем 3 апреля 2018 г. 16:58:20(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.02.2016(UTC) Сообщений: 60
Сказал(а) «Спасибо»: 18 раз Поблагодарили: 2 раз в 2 постах
|
Актуальный пример помог. Ниже для ключа с алгоритмом GOST3410_2012_512 Код: static byte[] encrypt2(byte[] buffer, X509Certificate publicCert, KeyPair keyPair) throws Exception {
CryptParamsSpec crp_params = CryptParamsSpec.getInstance(CryptParamsSpec.Rosstandart_TC26_Z);
PrivateKey senderKey = keyPair.getPrivate();
final PublicKey responderPublic = publicCert.getPublicKey();
// выработка ключа согласования отправителем
final KeyAgreement senderKeyAgree =
KeyAgreement.getInstance(publicCert.getPublicKey().getAlgorithm());
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*/ 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(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(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(
keyPair.getPublic().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(
keyPair.getPublic().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*/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();
}
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close