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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline alexundros  
#1 Оставлено : 28 ноября 2017 г. 12:35:10(UTC)
alexundros

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

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

Здравствуйте никак не могу понять некоторые вещи формируемой подписи КриптоПРО ЭЦП Browser plug-in:

1) Почему Хеш строки в base64 из КриптоПРО ЭЦП Browser plug-in отличается от того же алгоритма хеша полученного из openssl + gost.dll ?

var base64 = Base64.encode('test');
console.log(base64);
// dGVzdA==

var oHashDat = cadesplugin.CreateObject('CAdESCOM.HashedData');
oHashDat.Algorithm = 100;
oHashDat.DataEncoding = 1;

oHashDat.Hash(base64);
console.log(oHashDat.Value);
// BD87D56277DCC8EA36416BE9127E9BD3F54A6066B84851D638323E888859CE69

Тоже самое в openssl:
Положил строку 'dGVzdA==' в файл 'in.txt'

Запускаю в консоль:
openssl dgst -engine gost -md_gost94 in.txt
// md_gost94(in.txt)= a4c3fbf7c6f4d1311c957116c7cad3ccf41062a501423fc5ed26caaab9686fc7


2) Не получается проверить полученную в итоге подпись на сервере через openssl...

var oStore = cadesplugin.CreateObject('CAdESCOM.Store'),
oRawSig = cadesplugin.CreateObject('CAdESCOM.RawSignature'),
sign1, sign2;
oStore.Open();

var Certs = oStore.Certificates.Find(0, th); // th - sha1 отпечаток сертификата, устанавливается ранее...
if (!Certs.Count) alert('Сертификат #' + th + ' не найден!');
else {
var base64 = Base64.encode('test');
var oHashDat = cadesplugin.CreateObject('CAdESCOM.HashedData');

oHashDat.Algorithm = 100;
oHashDat.DataEncoding = 1;
oHashDat.Hash(base64);

sign1 = oRawSig.SignHash(oHashDat, Certs.Item(1));
console.log('sign1:',sign1); // HEX

// переворот, оставляю в тот же HEX формате но в перевернутом виде...
// код функций reverse, hex2bin, bin2hex не превожу в них проблем нет...
// переворот срабатывает правильно
sign2 = bin2hex(reverse(hex2bin(sign1)));
console.log('sign2:', sign2); // revHEX
}

Серверная часть:
PHP КОД:

$f = '/path/to/pub.key';

// $s - полученный бинарный файл подписи...
// tmp - создает временный файл с префиксом
// и содержимое полученной из первого аргумента
// pack - упаковка в бинарную строку...

$s = tmp ( pack ( 'H*' , $sign ) , 's' );

// $f - публичный ключ в pem формате
// можно получить из сертификата (openssl x509 -pubkey -noout -in cert.crt > pub.key)
// или извлечением из сертификата с приватным ключом в формат p12.pfx...

// cmd_exec - функция открывающая процесс и передающая в stdin исходную строку
// и выводящая результат из stdout для проверки подписи...
// вместо неё можно использовать и другую функцую...
// system ( 'openssl dgst -engine gost -verify "' . $f . '" -signature "' . $s . '" "' . $src . '" )
// но надо будет сохранить исходную строку в файл $src...

$r = cmd_exec ( 'openssl dgst -engine gost -verify "' . $f . '" -signature "' . $s . '"' , $data );

И в результате все время получаю только:
Verification Failure

Отдельно делал подпись и проверку на сгенерированном ключе и на экспортированном приватном ключе из КриптоПРО
все силами самого openssl и проверка проходит без проблем...
А вот как только не пытался вертеть байты подписи из плагина постоянно ошибка...

Подскажите пожалуйста в чем проблема в 1-ом вопросе и как быть со 2-ым вопросом...

Отредактировано пользователем 28 ноября 2017 г. 16:49:25(UTC)  | Причина: опечатка названия темы

Offline alexundros  
#2 Оставлено : 28 ноября 2017 г. 22:33:55(UTC)
alexundros

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

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

Первый вариант в openssl был на версии 1.0.2 где ГОСТ еще был встроен.
Собрал для версии 1.1.0g от 2.11.2017 и результат функции хеша тот же:
a4c3fbf7c6f4d1311c957116c7cad3ccf41062a501423fc5ed26caaab9686fc7
Offline cross  
#3 Оставлено : 29 ноября 2017 г. 17:10:54(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
hasheddata внутри себя декодирует base64 строку обратно и считает хэш от нее, а в openssl вы считаете хэш от base64(data) строки. У вас разные входные данные.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline alexundros  
#4 Оставлено : 30 ноября 2017 г. 8:40:27(UTC)
alexundros

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

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

Автор: cross Перейти к цитате
hasheddata внутри себя декодирует base64 строку обратно и считает хэш от нее, а в openssl вы считаете хэш от base64(data) строки. У вас разные входные данные.


в файл входных данных положил просто строку 'test' (hex:74 65 73 74):
вот хеш: ee67303696d205ddd2b2363e8e01b4b7199a80957d94d7678eaad3fc834c5a27

... как получить одинаковый хеш ?

Отредактировано пользователем 30 ноября 2017 г. 8:49:02(UTC)  | Причина: Не указана

Offline alexundros  
#5 Оставлено : 30 ноября 2017 г. 16:00:02(UTC)
alexundros

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

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

Воспользовался утилитой RHASH: https://sourceforge.net/projects/rhash/

Проверил на примерах с Википедии ...
https://ru.wikipedia.org...%D0%B0%D1%80%D1%82%D0%B0

ГОСТ хеш с «тестовым» набором параметров:
GOST ("") = CE85B99CC46752FFFEE35CAB9A7B0278ABB4C2D2055CFF685AF4912C49490F8D
GOST ("a") = D42C539E367C66E9C88A801F6649349C21871B4344C6A573F849FDCE62F314DD
GOST ("abc") = F3134348C44FB1B2A277729E2285EBB5CB5E0F29C975BC753B70497C06A4D51D
GOST ("message digest") = AD4434ECB18F2C99B60CBE59EC3D2469582B65273F48DE72DB2FDE16A4889A4D

Набор параметров CryptoPro:
GOST("") = 981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0
GOST("a") = E74C52DD282183BF37AF0079C9F78055715A103F17E3133CEFF1AACF2F403011
GOST("abc") = B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C
GOST("message digest") = BC6041DD2AA401EBFA6E9886734174FEBDB4729AA972D60F549AC39B29721BA0

Rhash все примеры воспроизводит...
--gost Тестовый набор
--gost-cryptopro Параметры CryptoPro

Моя строка 'test':
gost: a6e1acdd0cc7e00d02b90bccb2e21892289d1e93f622b8760cb0e076def1f42b
gost-cryptopro: ee67303696d205ddd2b2363e8e01b4b7199a80957d94d7678eaad3fc834c5a27

Строка 'test' в Base64 'dGVzdA==':
gost: 4c9a9dce9edbfc9b5e90ac8c7f9823cd0ba3f644403368abef087e20bd24bcb8
gost-cryptopro: a4c3fbf7c6f4d1311c957116c7cad3ccf41062a501423fc5ed26caaab9686fc7

Получается что строки точно совпадают с результатами из OpenSSL + gost engine
Но отличается от результата из плагина...
Offline cross  
#6 Оставлено : 1 декабря 2017 г. 15:52:05(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
А напишите версию ОС, браузера и плагина. Проверил у себя только что. У меня Linux и Chrome. Открыл страницу https://www.cryptopro.ru...ge/cades_bes_sample.html что бы инициализировать плагин и в console выполняю.
Цитата:

let tmp = cadesplugin.CreateObjectAsync("CADESCOM.hasheddata");
tmp.then((value) => window.hd = value);
hd.propset_Algorithm(100);
hd.propset_DataEncoding(1);
hd.Hash("dGVzdA==");
hd.Value.then(val => console.log(val))
EE67303696D205DDD2B2363E8E01B4B7199A80957D94D7678EAAD3FC834C5A27


Вроде все верно, для строки test совпадает с тем что считают другие средства.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.