Статус: Активный участник
Группы: Участники
Зарегистрирован: 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);
}
}
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close