Пример:
// данные для подписи и последющего шифрования
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)
| Причина: Не указана