Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2012(UTC) Сообщений: 18
|
Здравствуйте. Требуется проверить в JCP подпись сделанную на CSP. Подпись в CSP проверяется успешно, однако, на JCP всегда возвращается false. Вот пример кода:
//Снимаю хэш с тестовой строки final String SAMPLE_TEXT_1 = "Some Data 1"; final MessageDigest digest = MessageDigest.getInstance("GOST3411"); digest.update(SAMPLE_TEXT_1.getBytes("UTF-8")); byte[] digestResult1 = digest.digest();
// читаю публичный ключ из файла сертификата InputStream inStream = new FileInputStream("c:/certnew.cer"); X509Certificate cert = X509Certificate.getInstance(inStream); inStream.close(); PublicKey publicKey = cert.getPublicKey();
//Конвертирую полученную со стороны CSP подпись из base64 byte[] signature = Base64.decodeBase64("elxux7JzIdHS8Zqx+8AyuA+2GGNDvxTfC3XQT7PhFPwrXs5sCJaJqwkmfnsXK7N63IZreVO71vvfzI4rnWVb7w==");
//Инициирую проверку final Signature sig = Signature.getInstance("CryptoProSignature"); sig.initVerify(publicKey); sig.update(digestResult1);
//Здесь всегда получаю false boolean verify = sig.verify(signature);
Подскажите пожалуйста, где ещё искать грабли?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,031  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 729 раз в 687 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2012(UTC) Сообщений: 18
|
Спасибо за быстрый ответ. Попробовал инвертировать массив байт подписи. Не помогло. Как я понял из последнего поста отсюда: http://www.cryptopro.ru/....aspx?g=posts&t=1035 , инвертировать подпись нужно в случае использования GOST3411withGOST3410EL вместо CryptoProSignature. Однако я инициирую подпись с правильным параметром CryptoProSignature и по идее не должен её инвертировать. В любом случае, к сожалению, это не помогло.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,031  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 729 раз в 687 постах
|
А хешы с данных в csptest и jcp сходятся? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2012(UTC) Сообщений: 18
|
Не знаю на счёт csptest (этим занимается разрабочик со стороны C++), но совпадение хэшей проверяли. То есть снятие хэша со строки "Some Data 1" даёт одинаковый результат в CSP и JCP.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,031  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 729 раз в 687 постах
|
Пробовали проверить, используя GOST3411withGOST3410EL? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2012(UTC) Сообщений: 18
|
Спасибо за внимание к теме :) Да, пробовал. Результата не дало. Вообще, форум проштудировал внимательно. Но мог и пропустить что нибудь, так что буду рад опробовать все Ваши советы.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,031  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 729 раз в 687 постах
|
Попробуйте сделать наоборот, сформировать подпись в jcp и проверить в csp (csptest), убирать getBytes("UTF-8") вы, вероятно, пробовали; попробуйте подать данные в sig.update, а не хэш. Напишите, какую jre вы используете, ОС, версию jcp. Отредактировано пользователем 4 июня 2012 г. 22:25:23(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.05.2012(UTC) Сообщений: 33
|
Здравствуйте, пробовали сделать наоборот - создаем подпись в jcp, я проверяю в csp - результат тот же - false
все необходимое для работы проверено, поэтому привожу код непосредственно по работе с принятыми данными
FILE *hFile; BYTE rgbFile[BUFSIZE]; DWORD cbRead = 0; BOOL bResult = false; HCRYPTKEY hPubKey;
hFile = fopen("/media/58FF-9FCC/newCertificate.cer", "r+b");
if(hFile) printf("The file was opened successfully\n"); else printf("The error of file opening");
do { cbRead = (DWORD)fread(rgbFile, 1, BUFSIZE, hFile); if(!cbRead) { bResult = TRUE; break; } } while(!feof(hFile));
printf("Number of items read is %d \n", cbRead);
if (pSignerCert = CertCreateCertificateContext(CERT_TYPE, rgbFile, cbRead)) { printf("a new certificate has been created\n"); if(CryptImportPublicKeyInfo(hProv, CERT_TYPE, &(pSignerCert->pCertInfo->SubjectPublicKeyInfo), &hPubKey)) printf("import was successfully performed\n"); else { printf("import was bad"); return -1; }
unsigned char* sign = NULL; int leng; std::string inp = "aba7cc287acbf39a593594f6060930530553413d58c5bb974dd179590c8680ef3bac67bdc27822f7a4437b9468eece2c366bd2231073e61d0feb20fa34f6d997"; //подпись std::cout << inp.length() << std::endl; string_to_bytearray(inp, sign, leng); for(i = 0 ; i < leng ; i++) { printf("%02x ",sign[i]); //делаю для проверки функции, которую взял со сторонних сайтов ибо родной такой функции нет - как будет видно по выводу - рез-т //аналогичен }
if (!CryptVerifySignature(hHash, (BYTE*) sign, (DWORD) leng, hPubKey, 0, 0)) { printf("\nvse ploho"); return -1; }
delete[] sign;
Вывод работы:
The file was opened successfully Number of items read is 787 a new certificate has been created import was successfully performed 128 ab a7 cc 28 7a cb f3 9a 59 35 94 f6 06 09 30 53 05 53 41 3d 58 c5 bb 97 4d d1 79 59 0c 86 80 ef 3b ac 67 bd c2 78 22 f7 a4 43 7b 94 68 ee ce 2c 36 6b d2 23 10 73 e6 1d 0f eb 20 fa 34 f6 d9 97 vse ploho
Как видно - импорт ключа открытого из сертификата, присланного мне коллегой, прошел успешно...hHash - хэндл хэша снятого с той же строки "Some Data 1", однако проверка подписи возвращает FALSE
Буду очень признателен за любую оказанную помощь!!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2012(UTC) Сообщений: 18
|
ah написал:Здравствуйте, пробовали сделать наоборот - создаем подпись в jcp, я проверяю в csp - результат тот же - false К обсуждению ветки подключился наш разработчик со стороны C++ ))), вдвоём мы точно всем мозг вынесем ) afev написал:Попробуйте сделать наоборот, сформировать подпись в jcp и проверить в csp (csptest), убирать getBytes("UTF-8") вы, вероятно, пробовали; попробуйте подать данные в sig.update, а не хэш. Напишите, какую jre вы используете, ОС, версию jcp. Убирать getBytes("UTF-8") пробовал, подавать на вход данные вместо хэша - тоже. Версия Java:java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) ОС: Windows 7 6.1.7601 SP1 64 разрядная JCP:jcp.1.0.52 Ключевую пару на JCP я генерировал по "GOST3410", выгружал сертификат как в примере userSamples.Certificates.java Код, если нужно, могу выложить. Отредактировано пользователем 7 июня 2012 г. 0:48:57(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close