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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Анатолий  
#1 Оставлено : 13 февраля 2009 г. 17:32:31(UTC)
Анатолий

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

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

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

Предполагается использование КриптоПро JCP для обеспечения закрытого обмена.
На КриптоПро CSP все решалось использованием классических выховов CAPI.

HCRYPTPROV hProv; (PROV_GOST_2001_DH)
HCRYPTKEY *hKey;
LPBYTE *pbPubKey;
LPDWORD cbPubKey;
ALG_ID aiSrcKey;
LPSTR szDHOID;
LPSTR szHashOID;

CryptGenKey(hProv, aiSrcKey, CRYPT_PREGEN, hKey1);
CryptSetKeyParam(*hKey1, KP_X, NULL,0);
CryptExportKey(*hKey1, 0, PUBLICKEYBLOB, 0, pbEPubKey, &cbEPubKey);

//-----------------------------------------------------------------------------------------------------------//

ImportPublicKey(hProv, hKey1,hKEK, pbPubKey2, cbPubKey2,aiKey2, szDHOID2,szHashOID2);

Отталкиваясь от документации по JAVA и КриптоПРо мы попытались реализовать следующую конструкцию.

java.security.KeyStore hdImageStore = java.security.KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);

java.security.PrivateKey senderKey = (java.security.PrivateKey) hdImageStore.getKey("signkey", null);
java.security.cert.X509Certificate publicSenderCert = (java.security.cert.X509Certificate) hdImageStore.getCertificate("signkey");

final byte[] sv = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
final javax.crypto.KeyAgreement senderKeyAgree = javax.crypto.KeyAgreement.getInstance("GOST3410DH");
senderKeyAgree.init(senderKey, new javax.crypto.spec.IvParameterSpec(sv), null);
senderKeyAgree.doPhase(publicSenderCert, true);
javax.crypto.SecretKey sk = senderKeyAgree.generateSecret("GOST28147");

Все отрабатывается нормально, но alisaSecret.getEncoded() возвращает NULL;
Не совсем понятно с установкой параметров, в данной реализации как мы поимаем беруться текущие.

Пожалуйста, подскажите верна ли такая реализация и каким образом можно реализовать генерацию сессионного ключа в JCP.

Спасибо.









Offline Ольга  
#2 Оставлено : 18 февраля 2009 г. 18:00:01(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
Получать в открытом виде сессионный ключ запрещено. Ключ передается в зашифрованном виде:
Код:
    //случайный ключ
    final KeyGenerator kg = KeyGenerator.getInstance("GOST28147");
    final SecretKey key = kg.generateKey();

    //выработка ключа согласования для зашифрования ключа key
    final KeyAgreement keyAgree = KeyAgreement.getInstance("GOST3410DH");
    keyAgree.init(senderPrivateKey, sv, null);
    keyAgree.doPhase(responderPublicKey, true);
    final SecretKey secretKey = keyAgree.generateSecret("GOST28147");

    //создание шифратора
    Cipher cipher = Cipher.getInstance("GOST28147/PRO_EXPORT/NoPadding");
    //инициализация шифратора
    cipher.init(Cipher.WRAP_MODE, secretKey, sv);
    //зашифрованный ключ
    final byte[] wrap = cipher.wrap(key);

если работать навстречу с CSP, то следует передавать не wrap, а key и mac, полученные следующим образом:
Код:
final Asn1BerDecodeBuffer buf = new Asn1BerDecodeBuffer(wrap);
    final Gost28147_89_EncryptedKey ek = new Gost28147_89_EncryptedKey();
    ek.decode(buf);
    //key
    final Gost28147_89_Key enk = ek.encryptedKey;
    funal byte[] enkKey = enk.value;
    //mac
    final Gost28147_89_MAC mac = ek.macKey;
    final byte[] eMac = mac.value

Offline Анатолий  
#3 Оставлено : 18 февраля 2009 г. 20:38:18(UTC)
Анатолий

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

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

Спасибо, Ольга.

В принципе это мы и ожидали. Но проверить не смогли и не можем т.к.
cipher.init(javax.crypto.Cipher.WRAP_MODE, secretKey, new javax.crypto.spec.IvParameterSpec(sv));
приводит к
java.lang.UnsupportedOperationException
at javax.crypto.CipherSpi.engineGetKeySize(DashoA13*..)
at javax.crypto.Cipher.b(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)......

Вот весь кусочек кода-

CertificateFactory cf = CertificateFactory.getInstance("X509");
java.security.cert.Certificate cert = null;
java.io.FileInputStream fis = new java.io.FileInputStream("c:\\T3.cer");
cert = cf.generateCertificate(fis);
java.security.PublicKey pk = cert.getPublicKey();

final javax.crypto.KeyGenerator kg = javax.crypto.KeyGenerator.getInstance("GOST28147");
final javax.crypto.SecretKey key = kg.generateKey();

final byte[] sv = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
java.security.KeyStore hdImageStore = java.security.KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);

java.security.PrivateKey senderKey = (java.security.PrivateKey)hdImageStore.getKey("signkey", null);
java.security.cert.X509Certificate publicSenderCert = (java.security.cert.X509Certificate) hdImageStore.getCertificate("signkey");

//выработка ключа согласования для зашифрования ключа key
final javax.crypto.KeyAgreement senderKeyAgree = javax.crypto.KeyAgreement.getInstance("GOST3410DH");
senderKeyAgree.init(senderKey, new javax.crypto.spec.IvParameterSpec(sv), null);
senderKeyAgree.doPhase(pk, true);
final javax.crypto.SecretKey secretKey = senderKeyAgree.generateSecret("GOST28147");

//создание шифратора
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("GOST28147/PRO_EXPORT/NoPadding");
cipher.init(javax.crypto.Cipher.WRAP_MODE, secretKey, new javax.crypto.spec.IvParameterSpec(sv));
final byte[] wrap = cipher.wrap(key);

И наконец в этом алгоритме создания сессионного ключа на этапе согласования НЕОБХОДИМ открытый ключ другой стороны, который как мы понимаем как раз и будет использоваться для расшифрации wrap, что в принципе ОТЛИЧАЕТ его от формирования сессионного ключа через блок функций
CryptGenKey(hProv, aiSrcKey, CRYPT_PREGEN, hKey1);
CryptSetKeyParam(*hKey1, KP_X, NULL,0);
CryptExportKey(*hKey1, 0, PUBLICKEYBLOB, 0, pbEPubKey, &cbEPubKey);

Ольга, очень хочется получить от Вас необходимую информацию, т.к. на данный момент совершенно не понятно сможем ли мы повторить серверную реализацию крипты на JCP.

Offline Ольга  
#4 Оставлено : 19 февраля 2009 г. 13:29:44(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
1)необходимо снять экспортные ограничения (можно скопировать US_export_policy.jar в local_policy.jar, при этом первый тоже должен остаться).
2)сессионный ключ необходимо зашифровывать на ключе согласования (второй параметр ф-ции CryptExportKey), поскольку его нельзя передавать в открытом виде (это допустимо только для открытого ключа).
Offline Анатолий  
#5 Оставлено : 25 февраля 2009 г. 16:24:03(UTC)
Анатолий

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

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

Спасибо. Будем смотреть.
Offline Анатолий  
#6 Оставлено : 2 марта 2009 г. 15:14:19(UTC)
Анатолий

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

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

Добрый день.

Скажите, пожалуйста, каким образом сформировать данные для функции
keyCipher.unwrap(????, null, javax.crypto.Cipher.SECRET_KEY) для получения сессионного ключа если на входе мы имеем набор следующих данных для структуры CRYPT_SIMPLEBLOB:
1. Зашифрованный ключ ГОСТ 28147-89
2. Имитовставка по ГОСТ 28147-89 на ключ
3. Вектор инциализации для алгоритма CALG_PRO_EXPORT
4. ASN1 структуру в DER кодировке, определяющую параметры алгоритама шифрования ГОСТ 28147-89

Манипуляции с Gost28147_89_EncryptedKey, ParamsInterface и Asn1 успехом не увенчались, при unwrap ошибка - java.security.InvalidKeyException: Wrapped key is invalid
Offline Ольга  
#7 Оставлено : 2 марта 2009 г. 15:24:17(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
Код:
//создание шифратора
Cipher cipher = Cipher.getInstance("GOST28147/PRO_EXPORT/NoPadding");
//key
final Gost28147_89_EncryptedKey ek = new Gost28147_89_EncryptedKey();
final byte[] enc = Array.readFile("session_EncryptedKey.bin");
ek.encryptedKey = new Gost28147_89_Key(enc);
//mac
final byte[] mc = Array.readFile("session_MacKey.bin");
ek.macKey = new Gost28147_89_MAC(mc);

final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
ek.encode(ebuf);
final byte[] wrap = ebuf.getMsgCopy();
//расшифрование ключа
cipher.init(Cipher.UNWRAP_MODE, secretKey, sv);
final SecretKey key_ =
        (SecretKey) cipher.unwrap(wrap, null, Cipher.SECRET_KEY);
Offline Анатолий  
#8 Оставлено : 2 марта 2009 г. 18:32:47(UTC)
Анатолий

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

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

Спасибо, Ольга.
К сожалению Вы предложили такой же вариант решения какой тестировали мы. О не работает. Мы предполагали, что это связано с тем, что мы не использовали данные параметра алгоритма шифрования ГОСТ 28147-89. Для CSP это выглядит следующим образом

BYTE Key[32] = { 0x00......};
BYTE KeyMAC[4]= { 0x00......};
BYTE sv[8] = { 0x00......};
BYTE ASNstrSmpl[11] = { 0x00... };

BYTE blob[sizeof(CRYPT_SIMPLEBLOB)+sizeof(ASNstrSmpl)];
CRYPT_SIMPLEBLOB *Blob = (CRYPT_SIMPLEBLOB*)blob;

Blob->tSimpleBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob->tSimpleBlobHeader.BlobHeader.bType = SIMPLEBLOB;
Blob->tSimpleBlobHeader.BlobHeader.bVersion = (BYTE)0x20;
Blob->tSimpleBlobHeader.BlobHeader.reserved = 0;
Blob->tSimpleBlobHeader.EncryptKeyAlgId = CALG_G28147;
Blob->tSimpleBlobHeader.Magic = G28147_MAGIC;

memcpy(Blob->bEncryptedKey, Key, G28147_KEYLEN);
memcpy(Blob->MacKey, KeyMAC, EXPORT_IMIT_SIZE);
memcpy(Blob->bSV, sv, SEANCE_VECTOR_LEN);
memcpy(Blob->bEncryptionParamSet, ASNstrSmpl, sizeof( ASNstrSmpl ) );

CryptImportKey( hProv, blob, sizeof(CRYPT_SIMPLEBLOB)+sizeof(ASNstrSmpl), hOnKey, CRYPT_EXPORTABLE, phKey ))

Мы эксперементировали с ParamsInterface но ничего не получили. Каким образом нужно использовать параметры алгоритма шифрования?
Offline Русев Андрей  
#9 Оставлено : 2 марта 2009 г. 18:58:02(UTC)
Русев Андрей

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,271

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 446 раз в 325 постах
В новом CSP SDK (который, к сожалению, пока не выложен) есть примеры правильного (кроссплатформенного) согласования ключей, выработки и обмена общим симметричным ключом, зашифрования и расшифрования на нём. В readme.txt есть рецепт использования на Unix. Рецепт для Windows:
1. Создать контейнер Sender с ключом обмена и сертификатом, без пароля (например, веб-формой на тестовом УЦ).
2. Создать контейнер Responder с ключом обмена и сертификатом, без пароля (например, веб-формой на тестовом УЦ).
3. ExportInFile Sender
4. ExportInFile Responder
5. создать файл source.txt
6. EncryptFile
7. DecryptFile
Создание сертификатов, а не просто контейнеров с ключами принципиально. Примеры поддерживают и работу без сертификатов, но это нерекомендованный способ, т.к. он не защищает открытых ключей и не является кроссплатформенным, кроме того он не поддерживается КриптоПро JCP. В примерах КриптоПро JCP (подходящая сборка которых тоже не выложена) есть полностью аналогичные примеры. Они поддерживают встречную работу. Примеры из SDK приложил.

Отредактировано пользователем 2 марта 2009 г. 18:59:51(UTC)  | Причина: Не указана

Вложение(я):
samples.zip (814kb) загружен 90 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Официальная техподдержка. Официальная база знаний.
Offline Анатолий  
#10 Оставлено : 3 марта 2009 г. 20:13:05(UTC)
Анатолий

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

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

Спасибо за информацию. К сожалению, как я понимаю, Вы предоставили примеры для CSP. В нашей ситуации данные для структуры CRYPT_SIMPLEBLOB:
1. Зашифрованный ключ ГОСТ 28147-89
2. Имитовставка по ГОСТ 28147-89 на ключ
3. Вектор инциализации для алгоритма CALG_PRO_EXPORT
4. ASN1 структуру в DER кодировке, определяющую параметры алгоритама шифрования ГОСТ 28147-89
мы получаем от 3-ей стороны и изменить их формат не можем. Возможно ли формирование сертификата средствами КриптоПро JCP на приемной стороне на базе принимаемых данных с последующим использованием КриптоПро JCP?

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