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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline kanshins  
#1 Оставлено : 21 октября 2009 г. 14:32:48(UTC)
kanshins

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

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

Доброго времени суток!
Подскажите пожалуйста как при помощи JCP проверить подпись, которую создают при помощи КриптоАРМ.
Подпись получается в виде файла .p7s, причем как я знаю есть два вида формирования такой подписи когда данные и подпись в разных файла и когда в одном файле p7s.
Как при помощи JCP считать подпись и публичный ключ из этого файла и как проверить подпись?
Как при помощи JCP подписать файл и подпись с публичным ключем положить в файл p7s?
Offline apriam  
#2 Оставлено : 21 октября 2009 г. 21:54:43(UTC)
apriam

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

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

kanshins написал:

Как при помощи JCP считать подпись и публичный ключ из этого файла и как проверить подпись?
Как при помощи JCP подписать файл и подпись с публичным ключем положить в файл p7s?

Смотрите каталог JCP.1.0.46\samples\samples_src\CMS_samples\ там есть примеры, реализующие функционал, описанный в вопросах.

Поправка: требуется разархивировать файл samples_src.jar, входящий в дистрибутив JCP Shhh

Отредактировано пользователем 22 октября 2009 г. 17:25:01(UTC)  | Причина: Не указана

Offline kanshins  
#3 Оставлено : 26 октября 2009 г. 12:21:14(UTC)
kanshins

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

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

Конечно же я смотрел примеры JCP.1.0.46\samples\samples_src\CMS_samples\
CMS реализация не работает на файле p7s. Вот пример кода:

byte[] p7sBytes = Array.readFile("/work/тест.txt.p7s");
byte[] data = Array.readFile("/work/тест.txt"); final
Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(p7sBytes); final
ContentInfo all = new ContentInfo(); all.decode(asnBuf);

На последней строчке валиться исключение:
com.objsys.asn1j.runtime.Asn1MissingRequiredException: ASN.1 decode error @ offset 32:
SEQUENCE or SET is missing a required element.
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.SignedData.decode(SignedData.java:171)
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.checkTC(ContentInfo.java:137)
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:90)
at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15)
at test.JCPTest.test4(JCPTest.java:60)
at test.JCPTest.main(JCPTest.java:48)
com.objsys.asn1j.runtime.Asn1Exception: table constraint: content decode failed
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.checkTC(ContentInfo.java:141)
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:90)
at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15)
at test.JCPTest.test4(JCPTest.java:60)
at test.JCPTest.main(JCPTest.java:48)

Как я выяснил это проблема реализации CMS. Поэтому пришлось найти другое решение :)
Offline kanshins  
#4 Оставлено : 26 октября 2009 г. 12:29:43(UTC)
kanshins

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

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

Гораздо все проще делается используя класс sun.security.pkcs.PKCS7
Вот пример кода по созданию подписи и создания p7s файла:

KeyStore store = KeyStore.getInstance(STORE_NAME);
store.load(null, null);
X509Certificate cert = (X509Certificate) store
.getCertificate(container);
PrivateKey privateKey = (PrivateKey) store.getKey(container,
password.toCharArray());

// calculate message digest
MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME);
md.update(fileData);
byte[] fileDigest = md.digest();

// construct authenticated attributes...
PKCS9Attribute[] authenticatedAttributeList = {
new PKCS9Attribute(PKCS9Attribute.CONTENT_TYPE_OID,
ContentInfo.DATA_OID),
new PKCS9Attribute(PKCS9Attribute.SIGNING_TIME_OID,
new Date()),
new PKCS9Attribute(PKCS9Attribute.MESSAGE_DIGEST_OID,
fileDigest) };

PKCS9Attributes authenticatedAttributes = new PKCS9Attributes(
authenticatedAttributeList);

Signature sign = Signature.getInstance(JCP.GOST_EL_SIGN_NAME,
PROVIDER_NAME);
sign.initSign(privateKey);
sign.update(authenticatedAttributes.getDerEncoding());
byte[] signedAttributes = sign.sign();

ContentInfo contentInfo = null;
// We can attach the data here, or not
if (attachFile) {
contentInfo = new ContentInfo(ContentInfo.DATA_OID,
new DerValue(DerValue.tag_OctetString, fileData));
} else {
contentInfo = new ContentInfo(ContentInfo.DATA_OID, null);
}

X509Certificate[] certs = { cert };

SignerInfo si = new SignerInfo(new X500Name(cert.getIssuerDN()
.getName()), cert.getSerialNumber(), AlgorithmId
.get(JCP.GOST_DIGEST_NAME), authenticatedAttributes,
AlgorithmId.get("GOST3410EL"), signedAttributes, null);
SignerInfo[] signer = { si };

AlgorithmId[] digestAlgorithmIds = { AlgorithmId
.get(JCP.GOST_DIGEST_NAME) };
PKCS7 p7 = new PKCS7(digestAlgorithmIds, contentInfo, certs, signer);

ByteArrayOutputStream out = new ByteArrayOutputStream();
p7.encodeSignedData(out);
out.flush();
out.close();
return out.toByteArray();

А это пример по чтению p7s файла и проверка подписи:

PKCS7 p7 = new PKCS7(p7sBytes);
X509Certificate[] certs = p7.getCertificates();
PublicKey pub = certs[0].getPublicKey();
SignerInfo[] si = p7.getSignerInfos();
byte[] contentData = null;
if (null != fileData) {
contentData = fileData;
} else if (null != p7.getContentInfo().getData()) {
contentData = p7.getContentInfo().getData();
} else {
logger.warn("p7s file not contains data");
return false;
}
if (null != fileToSaveData) {
FileUtils.saveFile(fileToSaveData, contentData);
}
MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME);
md.update(contentData);
byte[] digestedContent = md.digest();
byte[] digest = (byte[]) si[0].getAuthenticatedAttributes()
.getAttributeValue(PKCS9Attribute.MESSAGE_DIGEST_OID);
if (!Arrays.equals(digestedContent, digest)) {
logger.warn("File digest (hash) is not valid. Signature is false");
return false;
}

checkKeyUsage(certs[0].getKeyUsage());

Signature sign = Signature.getInstance(JCP.GOST_EL_SIGN_NAME,
PROVIDER_NAME);
sign.initVerify(pub);
sign.update(si[0].getAuthenticatedAttributes().getDerEncoding());
return sign.verify(si[0].getEncryptedDigest());

Вариант конечно хороший, рабочий, проверял проверку подпись в КриптоАрм, но это покет sun.security, который со временем в обновлениях джава может исчежнуть, но скорее все его просто включат в комплект java.security.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.