Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
Добрый день.
Появилась одна проблема а вместе с ней и вопрос: 1. есть текст клиента 2. есть его подпись на этот текст 3. есть его же публичный ключ.
подписывался текст следующим образом: брался хеш текста а уже хеш подписывался.
Выполнялось это через CryptoPro C++.
Вопрос в следующем - почему на JCP при проверке тех же данных с помощью Signature -> verify и ключа клиента проверка подписи не проходит. (OID для хеша тот же) ?
Это связанно с тем, что используется для проверки демо версия JCP или нет ?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,431
Сказал(а) «Спасибо»: 37 раз Поблагодарили: 574 раз в 400 постах
|
Detached-подпись JCP имеет инверсный порядок байт по сравнению с CSP. Для встречной работы можно использовать специальный класс для совместимости: Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME, JCP.PROVIDER_NAME);
либо переворачивать подпись самостоятельно: byte[] sign = readFile(); sign = ru.CryptoPro.JCP.tools.Array.invByteOrderB(sign); s = Signature.getInstance(JCP.GOST_EL_SIGN_NAME, JCP.PROVIDER_NAME); ... s.verify(sign); |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
Всё равно не работает :-(, вот мой код:
public class CheckRealSign { private static String clientCertPath = "C:\\certs\\sign\\client.cer"; private static String clientSignPath = "C:\\certs\\sign\\client.sign"; private static String clientTextPath = "C:\\certs\\sign\\client_text.txt"; String signAlghorithmName = "GOST3411withGOST3410EL"; String digestAlgorithmName = "GOST3411"; private FileInputStream isClientCertPath; private FileInputStream isClientSignPath; private FileInputStream isClientTextPath; CertificateFactory cf = null; Certificate certClient = null; OID digestOID; public CheckRealSign() { digestOID = new OID("1.2.643.2.2.30.1"); } public void start() { try { isClientCertPath = new FileInputStream(clientCertPath); isClientSignPath = new FileInputStream(clientSignPath); isClientTextPath = new FileInputStream(clientTextPath); } catch (FileNotFoundException e) { System.out.println("Error: " + e.toString()); return; } try { cf = CertificateFactory.getInstance("X509"); certClient = cf.generateCertificate(isClientCertPath); } catch (CertificateException e) { System.out.println("Error cert: " + e.toString()); return; } byte[] clientTextByte; try { clientTextByte = new byte[isClientTextPath.available()]; isClientTextPath.read(clientTextByte); } catch (IOException e) { System.out.println("Error: " + e.toString()); return; } byte[] clientSignByte; try { clientSignByte = new byte[isClientSignPath.available()]; isClientSignPath.read(clientSignByte); } catch (IOException e) { System.out.println("Error: " + e.toString()); return; } clientSignByte = ru.CryptoPro.JCP.tools.Array.invByteOrderB(clientSignByte); MessageDigest digest = null; try { digest = MessageDigest.getInstance(digestAlgorithmName); } catch (NoSuchAlgorithmException e) { System.out.println("Error: " + e.toString()); return; } if(digest == null) { System.out.println("Error: digest is null."); return; } GostDigest gostDigest = (GostDigest)digest; gostDigest.reset(digestOID); ByteArrayInputStream stream = new ByteArrayInputStream(clientTextByte); DigestInputStream digestStream = new DigestInputStream(stream, gostDigest); try { while (digestStream.available() != 0) digestStream.read(); } catch (IOException e) { System.out.println("Error: " + e.toString()); return; } byte[] resultDigest = gostDigest.digest(); Signature sig; ParamsInterface digestParams = AlgIdSpec.getDefaultDigestParams(); digestParams.setDefault(digestOID); try { sig = Signature.getInstance(signAlghorithmName); sig.initVerify(certClient.getPublicKey()); sig.setParameter(digestParams); sig.update(resultDigest); boolean verifies = sig.verify(clientSignByte); if(verifies) { System.out.println("Client sign check OK, sign right."); } else { System.out.println("Client sign check Fail, sign wrong."); } } catch (NoSuchAlgorithmException e) { System.out.println("Error: " + e.toString()); return; } catch (InvalidKeyException e) { System.out.println("Error: " + e.toString()); return; } catch (SignatureException e) { System.out.println("Error: " + e.toString()); return; } catch (InvalidAlgorithmParameterException e) { System.out.println("Error: " + e.toString()); return; } } public static void main(String[] args) throws Exception { CheckRealSign checkRealSign = new CheckRealSign(); checkRealSign.start(); } }
Правильный ли он ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.01.2008(UTC) Сообщений: 207
Поблагодарили: 3 раз в 3 постах
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
Ольга написал:какие ошибки выдает?
Код ошибки не выдает, дело в том, что при проверке подписи из файла "client.sign" на текст из файла "client_text.txt", с сертификатом "client.cer", выдается ошибка, что подпись неверна. Подпись в файле "client.sign" создавалась с помощью CSP. Подпись однозначно верна, как и сертификат. Почему на JCP выдает, что подпись не верна ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.01.2008(UTC) Сообщений: 207
Поблагодарили: 3 раз в 3 постах
|
а вы CSP эту подпись проверяли?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.01.2008(UTC) Сообщений: 207
Поблагодарили: 3 раз в 3 постах
|
вот рабочий пример: Код:public static void main(String[] args) throws Exception {
//csptest.exe -keyset -sign GOST -container 111 -in e:\text -out e:\text.sign -keytype exchange
final byte[] buffer = Array.readFile("E:\\text");
final byte[] sig = Array.readFile("E:\\text.sign");
final CertificateFactory cf = CertificateFactory.getInstance("X509");
final Certificate cert =
cf.generateCertificate(new FileInputStream("E:\\111.cer"));
final PublicKey pub = cert.getPublicKey();
//var 1
final Signature s = Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME,
JCP.PROVIDER_NAME);
s.initVerify(pub);
s.update(buffer);
final boolean verifies = s.verify(sig);
System.out.println("signature verifies: " + verifies);
if (!verifies) {
throw new Exception("Signature was not verified");
}
//var 2
final Signature ss = Signature.getInstance(JCP.GOST_EL_SIGN_NAME,
JCP.PROVIDER_NAME);
ss.initVerify(pub);
ss.update(buffer);
final byte[] invSig = Array.invByteOrderB(sig);
final boolean verif = ss.verify(invSig);
System.out.println("signature verifies: " + verif);
if (!verif) {
throw new Exception("Signature was not verified");
}
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
Этот пример не подходит для моей ситуации - подпись делается по хешу, а не по самому тексту, в моем коде это и так описано. пробовал добавить Signature.getInstance(JCP.GOST_EL_SIGN_NAME, JCP.PROVIDER_NAME); и Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME, JCP.PROVIDER_NAME); результат - тот же самый. Вот только раскопали Array.invByteOrderB(sig); что ещё может быть ? почему не работает на JCP ? Отредактировано пользователем 28 мая 2008 г. 21:38:19(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.05.2008(UTC) Сообщений: 23 Откуда: Москва
|
Может ли всё выше перечисленное происходить по причине использования DEMO версии JCP ? Отредактировано пользователем 28 мая 2008 г. 22:06:37(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close