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

Уведомление

Icon
Error

6 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline ыволавыд  
#11 Оставлено : 28 августа 2019 г. 12:17:34(UTC)
ыволавыд

Статус: Участник

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

Решение интересное. Но как быть если в строке четное количество символов?
Сч равно количеству элементов массива, писать в новый массив надо начиная с последнего элемента массива
и надо остановиться когда элементы массива закончатся, поэтому запускается цикл следящий за состоянием переменной Сч,
значение которой на каждой итерации цикла уменьшается на единицу.
С начала записывается последний элемент массива с индексом Сч, потом с Сч-1 и так до тех пор пока Сч не станет равным 0.

Offline Санчир Момолдаев  
#12 Оставлено : 1 сентября 2019 г. 10:12:35(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
Автор: ыволавыд Перейти к цитате
Делал инвертирование таким способом:
ИнвертированыйМассив = Новый Массив;
МассивДоичныхДанных = РазделитьДвоичныеДанные(Подпись_ДвочиныеДанные, 1);
Сч = МассивДоичныхДанных.Количество();
Пока Сч <> 0 Цикл
Сч = Сч - 1;
ИнвертированыйМассив.Добавить(МассивДоичныхДанных[Сч]);
КонецЦикла;

Возврат СоединитьДвоичныеДанные(ИнвертированыйМассив );


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

Проверку такая подпись не прошла


сравните длину входного и инвертированного массива.

Отредактировано пользователем 1 сентября 2019 г. 12:39:17(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ыволавыд  
#13 Оставлено : 1 сентября 2019 г. 14:30:43(UTC)
ыволавыд

Статус: Участник

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

Одинаковая, 88 символов в Base64 или 64 байта в ДвоичныеДанные
Offline two_oceans  
#14 Оставлено : 2 сентября 2019 г. 6:18:09(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: ыволавыд Перейти к цитате
Решение интересное. Но как быть если в строке четное количество символов?
Сч равно количеству элементов массива, писать в новый массив надо начиная с последнего элемента массива
и надо остановиться когда элементы массива закончатся, поэтому запускается цикл следящий за состоянием переменной Сч,
значение которой на каждой итерации цикла уменьшается на единицу.
С начала записывается последний элемент массива с индексом Сч, потом с Сч-1 и так до тех пор пока Сч не станет равным 0.
Что-то запутали. Говорим одно и тоже, но на своих языках. У Вас между проверкой условия цикла и обращением к элементу массива МассивДвоичныхДанных[Сч] стоит уменьшение Сч, то есть последняя итерация на входе имеет Сч=1, потом Сч уменьшается до 0 и обращается к МассивДвоичныхДанных[0], все сходится. Заметьте, что переменная Сч не станет отрицительной, поэтому из Сч<>0 часть Сч<0 никогда не сработает, достаточно написать Сч>0 в условии цикла.

Пусть N число элементов массива, у меня вариант с нумерацией с 1 до N, у Вас с 0 до N-1. Что бы сделать из моего варианта 0 до N-1 надо просто вычесть единицу в 2 местах, вот так:
Код:
L:=A.length; // длина строки, поминаем как количество элементов, а не как номер последнего если нумерация с нуля!!!
j:=L-1;      // номер последнего байта, нумерация с 0
L:=(L shr 1)-1; // середина строки
for i:=0 to L do begin // с 0 до середины
  temp:=A[i];A[i]:=A[j];A[j]:=temp; // меняем A[i] и A[j]
  dec(j); // это j:=j-1; или j--;
end;


Четное или нечетное число элементов массива значение не имеет в силу специфики оператора shr 1, это сдвиг числа вправо на 1 бит, для положительных или беззнаковых чисел эффект как если бы число поделили пополам, но еще и теряется значение последнего бита (то есть как целочисленное деление на 2 без округления, на Бэйсике кажется это записывается как "N \ 2", направление черты не опечатка). Смотрите что выходит:
Если можно приведите исходное и инвертированное в Base64, что бы убедиться что соединилось все правильно (что-то не доверяю Бейсику).

Отредактировано пользователем 2 сентября 2019 г. 6:24:43(UTC)  | Причина: Не указана

Offline ыволавыд  
#15 Оставлено : 3 сентября 2019 г. 19:20:42(UTC)
ыволавыд

Статус: Участник

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

До реверса oDMaKFSCR1tE3rTXZb3X/6b5AbjbBBvf//m9Wm9wfJD2Wmk0ysRqx7gbI9Fa80WvJeKjl8IQmv6q0T7zbZzU6Q==
После gaCd35guiaMsxgELUVYRp90e79VJn5e6bZvfo43dVk3nvGhVK5CCziV1ijeGzbFzUlefi8ti7/VbBDGNxY8STQ==

Online Андрей Писарев  
#16 Оставлено : 3 сентября 2019 г. 20:06:15(UTC)
Андрей *

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

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

Сказал «Спасибо»: 493 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: ыволавыд Перейти к цитате
До реверса oDMaKFSCR1tE3rTXZb3X/6b5AbjbBBvf//m9Wm9wfJD2Wmk0ysRqx7gbI9Fa80WvJeKjl8IQmv6q0T7zbZzU6Q==
После gaCd35guiaMsxgELUVYRp90e79VJn5e6bZvfo43dVk3nvGhVK5CCziV1ijeGzbFzUlefi8ti7/VbBDGNxY8STQ==




1)
A0 33 1A 28 54 82 47 5B 44 DE B4 D7 65 BD D7 FF
A6 F9 01 B8 DB 04 1B DF FF F9 BD 5A 6F 70 7C 90
F6 5A 69 34 CA C4 6A C7 B8 1B 23 D1 5A F3 45 AF
25 E2 A3 97 C2 10 9A FE AA D1 3E F3 6D 9C D4 E9

2)
81 A0 9D DF 98 2E 89 A3 2C C6 01 0B 51 56 11 A7
DD 1E EF D5 49 9F 97 BA 6D 9B DF A3 8D DD 56 4D
E7 BC 68 55 2B 90 82 CE 25 75 8A 37 86 CD B1 73
52 57 9F 8B CB 62 EF F5 5B 04 31 8D C5 8F 12 4D


???
Техническую поддержку оказываем тут
Наша база знаний
Offline ыволавыд  
#17 Оставлено : 3 сентября 2019 г. 22:36:36(UTC)
ыволавыд

Статус: Участник

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

1) kjXLuG+yQyGEZKgJJSgYv46wpKIie11L4+2OHWq38xExibOqVAqYE1SarYq8NGAjjmBeJ3PK0XfcyXChQQ8XIQ==
2) IRcPQaFwydx30cpzJ15gjiNgNLyKrZpUE5gKVKqziTER87dqHY7t40tdeyKipLCOvxgoJQmoZIQhQ7JvuMs1kg==

1) 92 35 CB B8 6F B2 43 21 84 64 A8 09 25 28 18 BF 8E B0 A4 A2 22 7B 5D 4B E3 ED 8E 1D 6A B7 F3 11 31 89 B3 AA 54 0A 98 13 54 9A AD 8A BC 34 60 23 8E 60 5E 27 73 CA D1 77 DC C9 70 A1 41 0F 17 21
2)21 17 0F 41 A1 70 C9 DC 77 D1 CA 73 27 5E 60 8E 23 60 34 BC 8A AD 9A 54 13 98 0A 54 AA B3 89 31 11 F3 B7 6A 1D 8E ED E3 4B 5D 7B 22 A2 A4 B0 8E BF 18 28 25 09 A8 64 84 21 43 B2 6F B8 CB 35 92
Offline two_oceans  
#18 Оставлено : 4 сентября 2019 г. 5:27:19(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: ыволавыд Перейти к цитате
1) kjXLuG+yQyGEZKgJJSgYv46wpKIie11L4+2OHWq38xExibOqVAqYE1SarYq8NGAjjmBeJ3PK0XfcyXChQQ8XIQ==
2) IRcPQaFwydx30cpzJ15gjiNgNLyKrZpUE5gKVKqziTER87dqHY7t40tdeyKipLCOvxgoJQmoZIQhQ7JvuMs1kg==
Да, вот это правильный переворот.

Offline ыволавыд  
#19 Оставлено : 4 сентября 2019 г. 9:44:35(UTC)
ыволавыд

Статус: Участник

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

Понятно, спасибо

Так и не нашел способа сформировать подпись которая прошла бы у принимающей стороны,
финальный, на текущий момент, вариант алгоритма формирования подписи:
Код:

Хэш_HEXстрока = COMВычислитьХэшСуммуПоГОСТ_3411_2012(СтрокаДляФормированияДайджеста);
Хэш_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Хэш_HEXстрока);
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные);
	
Если СертификатCAdESCOM Тогда
 Сертификат = COMПолучитьСертификатCAdESCOM();
Иначе
 Сертификат = COMПолучитьСертификатCAPICOM();	
КонецЕсли;
	
oHashedData = Новый COMОбъект("CAdESCOM.HashedData");	
oHashedData.Algorithm = 101; // CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
oHashedData.DataEncoding = 1; // CADESCOM_BASE64_TO_BINARY	
oHashedData.SetHashValue(Хэш_HEXстрока);		
	
IRawSignature = Новый COMОбъект("CAdESCOM.RawSignature");
Подпись_HEXстрока = IRawSignature.SignHash(oHashedData, Сертификат);
	                                                       
Подпись_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Подпись_HEXстрока);
	
Если Реверс Тогда
 Подпись_ДвочиныеДанные = РеверсПодписи(Подпись_ДвочиныеДанные);	
КонецЕсли;
	
ПодписьBase64 = Base64Строка(Подпись_ДвочиныеДанные);
Offline two_oceans  
#20 Оставлено : 4 сентября 2019 г. 10:25:06(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Если все выглядит верно, но зашло в тупик, предлагаю суммировать известные данные.
Автор: ыволавыд Перейти к цитате
Для взаимодействия со сторонним сервисом мне необходимо формировать POST-запрос включающий в себя поля DigestValue и SignatureValue, формируемые по следующим правилам:
1. Вычислить хэш-сумму по ГОСТ Р 34.11-2012 и записать значение в DigestValue.
2. Подписать DigestValue по ГОСТ Р 34.10-2012 и записать значение в SignatureValue.

Проблема в том, что сторонний сервис ждет подпись вида:
rNTloWBbTsid1n9B1ANZ9/VasWJyg6jfiMeI12ERBSlOnzy6YFqMaa5nRb9ZrK9wbKimIBD70v8j8eP/tKn7/g==
Цитата:
с помощью третьего способа получилась подпись требуемого вида, но ее забраковали объяснив так "В вашей подписи алгоритм NONEwithCryptoProSignature, а должен быть GOST3411_2012_256withGOST3410_2012_256 CryptoProSignature_2012_256 NONEwithGOST3410DH_2012_256"
Автор: cross Перейти к цитате
идентификаторы из КриптоПро JCP. Они обозначают следующее:
GOST3411*withGOST3410* - принимает данные, которые хеширует и подписывает
CryptoProSignature* - принимает данные, которые хеширует и подписывает, значение подписи при этом инвертированное (первый байт становится последним и так далее..)
NONEwithCryptoProSignature* - принимает готовый хеш и подписывает его, значение подписи при этом инвертированное
Я все же не могу связно понять что с идентификаторами, которые прислали (там все-таки 3 идентификатора или один идентификатор), наверно правильный ответ должен быть в них. Версии пока: 1) принимающая сторона не принимает именно значение подписи? Хэш верный? или может быть надо перевернуть и хэш тоже? Только тот что идет на отправку или и тот что идет на подписание? В разных комбинациях с перевернутой и неперевернутой подписью:
Код:
а) Хэш_ДвочиныеДанные = РеверсПодписи(Хэш_ДвочиныеДанные)
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные)
б) Хэш_ДвочиныеДанные = РеверсПодписи(Хэш_ДвочиныеДанные)
Хэш_HEXстрока=HEX(Хэш_ДвочиныеДанные)
ХэшBase64 = Base64Строка(Хэш_ДвочиныеДанные)
; 2) остается идея что авторы сервиса замудрили в описании и надо на самом деле вычислить хэш, потом хэш2 от хэша, потом подписать хэш2.

Отредактировано пользователем 4 сентября 2019 г. 10:32:51(UTC)  | Причина: Не указана

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