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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline outerspace  
#1 Оставлено : 15 июля 2019 г. 9:57:56(UTC)
outerspace

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

Группы: Участники
Зарегистрирован: 15.07.2019(UTC)
Сообщений: 5
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Добрый день!

Если я формирую подпись файла data через команду cryptcp:
Код:
cryptcp -sign -uroot -thumbprint b9447942870e418075d3a80e8afee0ebac97120e -der -nocert -nochain -detached -pin mypassword data data.sgn

то в файле data.sgn получаю подпись в формате PKCS#7.

Если же я формирую подпись через команду csptest:
Код:
csptest -keyset -sign GOST12_256 -silent -cont le-2cf4ce8d-d0d5-4329-8cae-ce228a372aec -keytype exchange -in data -out data.sgn -password mypassword

то в файле data.sgn получаю 64 байта, насколько понимаю, «чистой» подписи.

Собственно, вопросы:
  1. Я могу как-то вытащить из файла PKCS#7 те самые 64 байта чистой подписи?
  2. Если нет, то каким образом я могу сформировать чистую подпись через CryptoAPI? В настоящий момент я использую функцию CryptMsgOpenToEncode, с нею у меня формируется полноценная подпись в формате PKCS#7.


Спасибо!
Offline Андрей Писарев  
#2 Оставлено : 15 июля 2019 г. 12:13:36(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Здравствуйте.

CryptCreateHash
CryptSignHash
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 15 июля 2019 г. 12:17:02(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: outerspace Перейти к цитате

Собственно, вопросы:[list=1]
  • Я могу как-то вытащить из файла PKCS#7 те самые 64 байта чистой подписи?



  • При проверке подписи - вызвать:
    Цитата:

    CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST...

    Техническую поддержку оказываем тут
    Наша база знаний
    thanks 1 пользователь поблагодарил Андрей * за этот пост.
    outerspace оставлено 16.07.2019(UTC)
    Offline outerspace  
    #4 Оставлено : 16 июля 2019 г. 9:53:52(UTC)
    outerspace

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

    Группы: Участники
    Зарегистрирован: 15.07.2019(UTC)
    Сообщений: 5
    Российская Федерация
    Откуда: Москва

    Сказал(а) «Спасибо»: 1 раз
    Андрей,
    спасибо за ответ!

    Попробовал сделать, как вы советуете:
    Цитата:
    При проверке подписи - вызвать:
    Цитата:
    CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST...


    Для этого я взял пример /opt/cprocsp/src/samples/CSP/CryptMsgSign и добавил в конец функции do_low_verify() (прямо перед комментарием «Освобождение памяти») следующий код:
    Код:
    DWORD cbSize;
    if(CryptMsgGetParam(
            hMsg,
            CMSG_ENCRYPTED_DIGEST,
            0,
            NULL,
            &cbSize)) {
        printf("The length of the pure signature has been calculated: %d bytes \n", cbSize);
    } else {
        HandleError("MsgGetParam failed");
    }
    
    BYTE *pbPureSignature = (BYTE *)malloc(cbSize);
    if(CryptMsgGetParam(
            hMsg,
            CMSG_ENCRYPTED_DIGEST,
            0,
            pbPureSignature,
            &cbSize)) {
        printf("Pure signature successfully obtained. \n");
    } else {
        HandleError("MsgGetParam failed");
    }
    
    FILE *f = fopen("data.sgn", "wb");
    if (!f) {
        HandleError("Could not open file!");
    }
    fwrite(pbPureSignature, 1, cbSize, f);
    fclose(f);
    


    Этот кусочек кода при запуске записал 64 байта подписи в файл data.sgn.
    Чтобы убедиться, что получившаяся подпись корректна, я делаю следующее:
    1. Создаю файл с данными, аналогичными тем, что в примере:
      Код:
      echo -n "Security is our business." > data

    2. Подписываю его утилитой csptest
      Код:
      csptest -keyset -sign GOST12_256 -silent -cont le-2cf4ce8d-d0d5-4329-8cae-ce228a372aec -keytype exchange -in data -out data.sgn.csptest -password mypassword -export public.key

    3. Проверяю, что такая подпись валидируется
      Код:
      csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn.csptest -import public.key
         # ...
      Signature was verified OK

    4. А теперь точно такой же командой проверяю файл, сгенерированный моим приложением
      Код:
      csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key
         # ...
      Invalid Signature.

    В чём может быть ошибка?
    Моя задача — получить 64 байта подписи, которые будут успешно валидироваться утилитой csptest.
    Offline two_oceans  
    #5 Оставлено : 16 июля 2019 г. 10:11:32(UTC)
    two_oceans

    Статус: Эксперт

    Группы: Участники
    Зарегистрирован: 05.03.2015(UTC)
    Сообщений: 1,602
    Российская Федерация
    Откуда: Иркутская область

    Сказал(а) «Спасибо»: 110 раз
    Поблагодарили: 393 раз в 366 постах
    Предположу 2 варианта: 1) подпись выполнена разными алгоритмами (гост-2001 и гост-2012 256, проверьте перенесен ли пример на гост-2012) или разными сертификатами - тогда действительно длина будет 64, но проверка закономерно выдаст ошибку потому что расшифрованный хэш не совпадет с фактическим; 2) что-то не так с порядком байтов, возможно потребуется записать байты в обратном порядке. Как вариант использовать какой-то еще ключ чтобы команда проверки переворачивала на ходу.

    Отредактировано пользователем 16 июля 2019 г. 10:17:45(UTC)  | Причина: Не указана

    Offline outerspace  
    #6 Оставлено : 16 июля 2019 г. 12:02:18(UTC)
    outerspace

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

    Группы: Участники
    Зарегистрирован: 15.07.2019(UTC)
    Сообщений: 5
    Российская Федерация
    Откуда: Москва

    Сказал(а) «Спасибо»: 1 раз
    Автор: two_oceans Перейти к цитате
    Предположу 2 варианта: 1) подпись выполнена разными алгоритмами (гост-2001 и гост-2012 256, проверьте перенесен ли пример на гост-2012) или разными сертификатами - тогда действительно длина будет 64, но проверка закономерно выдаст ошибку потому что расшифрованный хэш не совпадет с фактическим; 2) что-то не так с порядком байтов, возможно потребуется записать байты в обратном порядке. Как вариант использовать какой-то еще ключ чтобы команда проверки переворачивала на ходу.


    1. Да-да, тоже об этом подумал! Поэтому добавил в do_low_sign() после вызова GetHashOidForSign() вот такой код:
      Код:
      printf("Hash algo is %s\n", HashAlgorithm.pszObjId);
      printf("Signature algo is %s\n", pRecipientCert->pCertInfo->SignatureAlgorithm.pszObjId);


      И получил
      Код:
      Hash algo is 1.2.643.7.1.1.2.2
      Signature algo is 1.2.643.7.1.1.3.2


      т. е. алгоритмы используются верные.
      Сертификат у меня в хранилище My только один, так что и тут тоже вряд ли проблема.

    2. Попробовал перевернуть подпись. Для этого воспользовался такой командой (нагуглил):
      Код:
      < data.sgn xxd -p -c1 | tac | xxd -p -r > data.sgn.rev
      Файл data.sgn.rev также не проходит проверку (то, что байты перевернулись правильно, проверил через xxd -i — всё ок).
    Offline outerspace  
    #7 Оставлено : 17 июля 2019 г. 16:08:02(UTC)
    outerspace

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

    Группы: Участники
    Зарегистрирован: 15.07.2019(UTC)
    Сообщений: 5
    Российская Федерация
    Откуда: Москва

    Сказал(а) «Спасибо»: 1 раз
    В итоге, друзья, есть какие-то идеи, почему такое происходит?

    Напомню: я хочу программно через CryptoAPI генерировать ЭЦП, которую успешно проверит команда
    Код:
    csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key
    Offline Андрей Писарев  
    #8 Оставлено : 17 июля 2019 г. 18:26:19(UTC)
    Андрей *

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

    Группы: Участники
    Зарегистрирован: 26.07.2011(UTC)
    Сообщений: 12,630
    Мужчина
    Российская Федерация

    Сказал «Спасибо»: 494 раз
    Поблагодарили: 2034 раз в 1578 постах
    Автор: outerspace Перейти к цитате
    В итоге, друзья, есть какие-то идеи, почему такое происходит?

    Напомню: я хочу программно через CryptoAPI генерировать ЭЦП, которую успешно проверит команда
    Код:
    csptest -keyset -verify GOST12_256 -silent -keytype exchange -in data -signature data.sgn -import public.key


    Пришлите в zip архиве файлы: data.sgn и public.key (которые проходят проверку в csptest)
    Техническую поддержку оказываем тут
    Наша база знаний
    Offline Андрей Писарев  
    #9 Оставлено : 17 июля 2019 г. 18:41:04(UTC)
    Андрей *

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

    Группы: Участники
    Зарегистрирован: 26.07.2011(UTC)
    Сообщений: 12,630
    Мужчина
    Российская Федерация

    Сказал «Спасибо»: 494 раз
    Поблагодарили: 2034 раз в 1578 постах
    Предположу, что в CMS у Вас подпись сформирована под структурой, которая включает хеш+атрибуты.
    Техническую поддержку оказываем тут
    Наша база знаний
    Offline outerspace  
    #10 Оставлено : 18 июля 2019 г. 7:59:41(UTC)
    outerspace

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

    Группы: Участники
    Зарегистрирован: 15.07.2019(UTC)
    Сообщений: 5
    Российская Федерация
    Откуда: Москва

    Сказал(а) «Спасибо»: 1 раз
    Автор: Андрей Писарев Перейти к цитате
    Пришлите в zip архиве файлы: data.sgn и public.key (которые проходят проверку в csptest)



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