Статус: Участник
Группы: Участники
Зарегистрирован: 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 (и то безрезультатно). Поделитесь пожалуйста (не зависимо от языка разработки) своим опытом в данном вопросе.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 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.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.08.2018(UTC) Сообщений: 16 Откуда: Новосибирск
|
Вот это, как раз те знания которых мне и не хватало) Цитата:Итого: ничего наверно не находится по тому что в большинстве случаев достаточно выполнить base64-decode и получите DER. Супер, спасибо большое ) По поводу второго пункта: Мне придётся переводить в DER на клиенте , потому что на клиенте мне необходимо Подписать + Зашифровать, и то и то должно быть в DER.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Когда данные в плагине вы передаете в base64 и указываете кодировку Base64 то внутри они декодируются в бинарные и подписываются(шифруются) как бинарные данные. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.08.2018(UTC) Сообщений: 16 Откуда: Новосибирск
|
Цитата:Когда данные в плагине вы передаете в base64 и указываете кодировку Base64 то внутри они декодируются в бинарные и подписываются(шифруются) как бинарные данные. Хм ... и всё равно я пришел к тупику. Что я делаю (это всё я пишу в 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) не поддерживается. Неужели это всё )))) ???
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Вы делаете что то странное. Зачем вам вот это windows1251.decode(atob(encryptedDataInBase64)); Что мешает зашифровать base64? Методы не зря возвращают именно base64 кодированные данные, яваскрипт не очень любит бинарные строки.
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.08.2018(UTC) Сообщений: 16 Откуда: Новосибирск
|
Цитата:Вы делаете что то странное. Зачем вам вот это Это требования нашего сервиса, который занимается обработкой итоговых файлов. Ему необходимо чтобы после дешифровки был DER.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Цитата:у меня в реализации сперва Sign потом ENC Ясно, я написал наоборот потому что тогда меньше объем данных на шифрование и подпись по сути скрывать незачем. Читал как-то давний спор на английском о отм что лучше и кто-то там говорил что безопаснее как раз делать как у Вас. Где-то сохранил, но не разбирался в аргументах сторон. А вот что DEC(ENC(TEXT1))!= TEXT1 это очень странно, наверно проблема как данные считываются. Помню у меня с этим были проблемы в VBS там вообще по умолчанию досовская кодировка и читать что-либо приходится через ADOStream как двоичные данные. Возможно в Вашем случае также нужно считывать исходный текст как двоичные данные, к которым понятие кодировка неприменимо и "услужливые" функции замены кодировки идут покурить. Отредактировано пользователем 13 ноября 2018 г. 13:47:02(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close