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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline samoha  
#1 Оставлено : 2 ноября 2018 г. 7:40:22(UTC)
samoha

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

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

Всем привет!
Реализовал подписания + шифрования на клиенте в Base-64.

Теперь есть необходимость сделать тоже самое только в DER.

И вот тут проблема.
В этой ветке https://www.cryptopro.ru/forum2/....aspx?g=posts&t=5738 уже обсуждали данную проблему, и в завершении пришли к тому, что на клиенте и не получится переводить в DER.
Собственно вопросы:
1. Необходимо исходные данные переводить в DER, или уже шифрованные?
2. Может быть сейчас появилась возможность все сделать на клиенте?
3. И как вообще string to DER? Я разрабатываю на .Net, и пока мои поиски сводятся только к либе - BouncyCastle (и то безрезультатно). Поделитесь пожалуйста (не зависимо от языка разработки) своим опытом в данном вопросе.
Offline two_oceans  
#2 Оставлено : 2 ноября 2018 г. 13:43:17(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Доброго времени.
Вопрос наверное немного некорректен. В теме на которую ссылка намек:
Цитата:
Используйте base64 и декодируйте в DER подходящим способом.

Начну с конца, пункта 3: принципиально данные подписи в base64 также могут быть закодированы несколькими способами, в том числе и кодировкой DER (я бы сказал обычно она там и есть), просто поверх этой кодировки применен еще и алгоритм base64-encode и могут быть добавлены посторонние текстовые данные. Соответственно если убрать посторонние данные (если у Вас обычная строка без связного текста и кончающаяся =, то сторонних данных скорее всего нет) и сделать base64-decode то получится исходная кодировка (которая, скорее всего, и есть DER). Если же там не DER, то все усложняется и Вам надо искать модули работы с ASN.1, которые смогут исправить кодировку которая есть на кодировку DER. Итого: ничего наверно не находится по тому что в большинстве случаев достаточно выполнить base64-decode и получите DER.
Алгоритм base64 достаточно прост и реализаций его кодирование-декодирования наверно по десятку на каждую среду разработки. Можно выбрать по вкусу или еще раз изобрести велосипед. Кроме того, есть winapi функции CryptStringToBinary CryptBinaryToString реализующие вариант его же. Правда в них декодирование работает немного странно.
пункт 2. Наверно и не нужно переводить на клиенте, для передачи серверу все равно base64 намного удобнее. А сервер может декодировать как ему удобно.
пункт 1. В кодировку DER обычно записываются структуры содержащие cryptomessage то есть это или шифрованные или подписанные данные (в зависимости от операции). Сами исходные данные как правило не попадают под это. При помощи модулей работы с ASN.1 их конечно можно внести в структуру DER, но "просто так" это сделать смысла нет. Исключение разве что в случае, когда в подпись включаются и сами исходные данные, тогда исходные данные будут включены внутри одного из элементов кодировки DER.
Offline samoha  
#3 Оставлено : 6 ноября 2018 г. 12:05:14(UTC)
samoha

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

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

Вот это, как раз те знания которых мне и не хватало)
Цитата:
Итого: ничего наверно не находится по тому что в большинстве случаев достаточно выполнить base64-decode и получите DER.

Супер, спасибо большое )

По поводу второго пункта:
Мне придётся переводить в DER на клиенте Sick, потому что на клиенте мне необходимо Подписать + Зашифровать, и то и то должно быть в DER.

Offline cross  
#4 Оставлено : 6 ноября 2018 г. 12:17:22(UTC)
Анатолий Беляев

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Когда данные в плагине вы передаете в base64 и указываете кодировку Base64 то внутри они декодируются в бинарные и подписываются(шифруются) как бинарные данные.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline samoha  
#5 Оставлено : 7 ноября 2018 г. 8:59:49(UTC)
samoha

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

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

Цитата:
Когда данные в плагине вы передаете в base64 и указываете кодировку Base64 то внутри они декодируются в бинарные и подписываются(шифруются) как бинарные данные.


Хм ... и всё равно я пришел к тупику.d'oh!

Что я делаю (это всё я пишу в TypeScript):
Код:

// подписываю данные
let signedDataInBase64 = oSignedData.SignCades(oSigner, this.cadesPluginSync.CADESCOM_CADES_BES)

// декодирую из Base64, а также выставляю нужную мне кодировку
let signedData = windows1251.decode(atob(signedDataInBase64));

// шифрую данные
let oEnvelop = this.cadesPluginSync.CreateObject('CAdESCOM.CPEnvelopedData');
oEnvelop.ContentEncoding = this.cadesPluginSync.CADESCOM_BASE64_TO_BINARY; // вот тут на самом деле и скрывается проблема
oEnvelop.Content = signedData;
oEnvelop.Recipients.Add(certificate);

let encryptedDataInBase64 = oEnvelop.Encrypt();

// опять декодирую из Base64, а также выставляю нужную мне кодировку
let encryptedData = windows1251.decode(atob(encryptedDataInBase64));


Дальше отправляю encryptedData на сервер и там сохраняю информацию в файл.
Потом пытаюсь этот файл расшифровать и проверить подпись с помощью утилиты cryptcp.exe.
Расшифровывается без проблем, но вот на проверки подписи ошибка - Ошибка: Встречено неверное значение тега ASN1.

Ага, смотрю в файл, подозрительно мало текста, да + к этому не вижу саму информацию которую подписываю.
Думаю дайка я поставлю в параметре oEnvelop.ContentEncoding = this.cadesPluginSync.CADESCOM_STRING_TO_UCS2LE;

По итогу - также расшифровывается, и данные после расшифровки более красивые, то есть в них присутствует информация, а также информация о подписи.
Но снять подпись также не получается - Ошибка: Встречено неверное значение тега ASN1.
И тут я замечаю что кодировка самого текста в файле - UCS-2 Little Endian, а мне нужна Win-1251.
Получается cadesplagin - сам внутри себя меняет кодировки ) и это больно...

Цитата:
Замечания от крипто-про:
В КриптоПро ЭЦП Browser plug-in кодировка DER (параметр CAPICOM_ENCODE_BINARY) не поддерживается.


Неужели это всё )))) ???
Offline cross  
#6 Оставлено : 8 ноября 2018 г. 12:32:32(UTC)
Анатолий Беляев

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Вы делаете что то странное. Зачем вам вот это
windows1251.decode(atob(encryptedDataInBase64));
Что мешает зашифровать base64?
Методы не зря возвращают именно base64 кодированные данные, яваскрипт не очень любит бинарные строки.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline samoha  
#7 Оставлено : 13 ноября 2018 г. 7:13:16(UTC)
samoha

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

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

Цитата:
Вы делаете что то странное. Зачем вам вот это

Это требования нашего сервиса, который занимается обработкой итоговых файлов.
Ему необходимо чтобы после дешифровки был DER.

Offline two_oceans  
#8 Оставлено : 13 ноября 2018 г. 8:21:38(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Тогда вопрос - в каком виде сервис принимает данные. Предположу, что все равно зашифрованные данные пересылаются в base64, то есть типичный обмен с удаленным веб-сервисом (не используя плагин) выглядит примерно так:
1. Есть исходные данные для подписания и зашифровки
2. зашифровываете исходные данные, получаете зашифрованные данные в DER
3. Зашифрованные данные в DER подписываете подписью - результат в DER
4. подаете подписанный+зашифрованный DER на отправку
5. функция отправки переделывается DER в base64
6. функция отправки отправляет сервису base64 в составе какой-то обертки
7. сервис разворачивает обертку и получает base64
8. сервис переделывает из base64 в DER
9. сервис снимает подпись, получает зашифрованные данные в DER
10. сервис дещифровывает DER получает исходные данные.

В случае плагина данные на выходе шага 2, входе шага 3 и выходе шага 3, входе шага 4 будут в base64, то есть шаг 5 не понадобится. Кстати, если "зашифрованные" имеете в виду преобразованные к base64, можно выкинуть шаги 2 и 10.

Отредактировано пользователем 13 ноября 2018 г. 8:23:15(UTC)  | Причина: Не указана

Offline samoha  
#9 Оставлено : 13 ноября 2018 г. 11:16:17(UTC)
samoha

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

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

С самим сервисом мы общаемся немного иначе, очень грубо говоря я просто складываю ему файлы в определённую директорию, вида - content.txt.sig.enc.
Сервис забирает эти файлы, и начинает с ними работать.
1. Расшифрование.
2. Снятия + проверка подписи.
И на 1 и на 2 шаге ему необходимо DER, он нечего не будет преобразовывать, грубо говоря он работает только в DER ***.

То что вы написали во втором шаге, у меня в реализации сперва Sign потом ENC -
Цитата:
зашифровываете исходные данные, получаете зашифрованные данные в DER

У меня проблема была в том, что я пытаюсь зашифровать текст в Win-1251, а при шифровании кодировка меняется и я теряю исходные данные.

Что-то вот такое получается.
TEXT_ENC = ENC(TEXT1);
TEXT1' = DEC(TEXT_ENC);
TEXT1' != TEXT1


И на эту внутреннюю кухню я могу повлиять только выставлением параметра oEnvelop.ContentEncoding, что я и описывал выше.

*** - ребята занимающиеся разработкой данного сервиса, уже подпилили его, и теперь ему без разницы что принимать ))), вся эта тема поднималась до подпиливания сервиса ).
Тут наверное больше проблема была в сервисе, всё таки base64 куда адекватнее чем DER.
Offline two_oceans  
#10 Оставлено : 13 ноября 2018 г. 13:43:27(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Цитата:
у меня в реализации сперва Sign потом ENC
Ясно, я написал наоборот потому что тогда меньше объем данных на шифрование и подпись по сути скрывать незачем. Читал как-то давний спор на английском о отм что лучше и кто-то там говорил что безопаснее как раз делать как у Вас. Где-то сохранил, но не разбирался в аргументах сторон.

А вот что DEC(ENC(TEXT1))!= TEXT1 это очень странно, наверно проблема как данные считываются. Помню у меня с этим были проблемы в VBS там вообще по умолчанию досовская кодировка и читать что-либо приходится через ADOStream как двоичные данные. Возможно в Вашем случае также нужно считывать исходный текст как двоичные данные, к которым понятие кодировка неприменимо и "услужливые" функции замены кодировки идут покурить.

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

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