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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ZiCold  
#1 Оставлено : 12 января 2022 г. 6:44:48(UTC)
ZiCold

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

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

Добрый день! Использую библиотеку CoreFx для проверки подписи.
Проверка происходит кодом:
Код:
ContentInfo contentInfo = new ContentInfo(msg);

//  Создаем SignedCms для декодирования и проверки.
SignedCms signedCms = new SignedCms(contentInfo, true);

//  Декодируем подпись
signedCms.Decode(encodedSignature);

signedCms.CheckSignature(true);


У меня есть два файла для проверки. Первый был подписан при помощи кода Diadoc, второй при помощи утилиты CryptCp.
Код Диадок создаёт подпись и проверяет её через Crypt32.dll (если я правильно понял).
CoreFx подключен через nuget package, согласно его инструкции на гитхабе.
CryptCp подписывает при помощи команды -signf

Первый файл декодируется и проверяется успешно.
Второй файл выдаёт ошибку на этапе Decode:
Код:
System.Security.Cryptography.CryptographicException: 'ASN1 corrupted data.'


Как такое может быть и куда смотреть? Файлы могу приложить в принципе.
Offline TolikTipaTut1  
#2 Оставлено : 12 января 2022 г. 9:10:11(UTC)
TolikTipaTut1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 32 раз
Поблагодарили: 30 раз в 27 постах
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.

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

Offline Андрей *  
#3 Оставлено : 12 января 2022 г. 10:40:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
Автор: ZiCold Перейти к цитате

Второй файл выдаёт ошибку на этапе Decode:
Код:
System.Security.Cryptography.CryptographicException: 'ASN1 corrupted data.'


Как такое может быть и куда смотреть? Файлы могу приложить в принципе.


Когда нет информации, что получается от утилит\сервисов в файле, такое может быть почти с каждым, но не всеми...
Кто-то идёт немного дальше, сравнивает размеры или осмеливается открывать в каких-то редакторах и видит... или asn.1 или base64... делает выводы и сам декодирует, получая нужный вид (asn1), прежде чем отправлять в Decode поток байт...
Техническую поддержку оказываем тут
Наша база знаний
Offline ZiCold  
#4 Оставлено : 22 января 2022 г. 11:24:00(UTC)
ZiCold

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

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

Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?
Offline ZiCold  
#5 Оставлено : 22 января 2022 г. 11:28:49(UTC)
ZiCold

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

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

Автор: Андрей * Перейти к цитате
или asn.1 или base64... делает выводы и сам декодирует, получая нужный вид (asn1), прежде чем отправлять в Decode поток байт...


Есть какой-то способ это делать программно?
Offline TolikTipaTut1  
#6 Оставлено : 22 января 2022 г. 11:30:10(UTC)
TolikTipaTut1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 32 раз
Поблагодарили: 30 раз в 27 постах
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?


Ну вы exception отловили и попробовали иначе сделать
Offline ZiCold  
#7 Оставлено : 22 января 2022 г. 11:49:47(UTC)
ZiCold

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

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

Автор: TolikTipaTut1 Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?


Ну вы exception отловили и попробовали иначе сделать


Я пытаюсь поменять кодирование
var docBytes = System.IO.File.ReadAllBytes(Path.Combine(dir, docName));
var docStr64 = Convert.ToBase64String(docBytes);
var docBytes64 = Encoding.ASCII.GetBytes(docStr64);

Но ошибка та же самая: ASN1 corrupted data

Что еще можно сделать? Меня удивляет, что проблема именно с файлом, который подписала утилита КриптоПро CryptCp, а не сторонняя программа.
Offline TolikTipaTut1  
#8 Оставлено : 22 января 2022 г. 11:55:19(UTC)
TolikTipaTut1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 32 раз
Поблагодарили: 30 раз в 27 постах
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?


Ну вы exception отловили и попробовали иначе сделать


Я пытаюсь поменять кодирование
var docBytes = System.IO.File.ReadAllBytes(Path.Combine(dir, docName));
var docStr64 = Convert.ToBase64String(docBytes);
var docBytes64 = Encoding.ASCII.GetBytes(docStr64);

Но ошибка та же самая: ASN1 corrupted data

Что еще можно сделать? Меня удивляет, что проблема именно с файлом, который подписала утилита КриптоПро CryptCp, а не сторонняя программа.


Файл пришлите
Offline Андрей *  
#9 Оставлено : 22 января 2022 г. 12:14:02(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?


Ну вы exception отловили и попробовали иначе сделать


Я пытаюсь поменять кодирование
var docBytes = System.IO.File.ReadAllBytes(Path.Combine(dir, docName));
var docStr64 = Convert.ToBase64String(docBytes);
var docBytes64 = Encoding.ASCII.GetBytes(docStr64);

Но ошибка та же самая: ASN1 corrupted data

Что еще можно сделать? Меня удивляет, что проблема именно с файлом, который подписала утилита КриптоПро CryptCp, а не сторонняя программа.


И что же делает написанное?
Техническую поддержку оказываем тут
Наша база знаний
Offline TolikTipaTut1  
#10 Оставлено : 22 января 2022 г. 12:15:46(UTC)
TolikTipaTut1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 32 раз
Поблагодарили: 30 раз в 27 постах
Автор: Андрей * Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Проблема может быть в том, что одна подпись в "формате" DER, a вторая - в Base64.


Хорошо, а как можно это проверить программно? Например, запустить метод с другими параметрами?


Ну вы exception отловили и попробовали иначе сделать


Я пытаюсь поменять кодирование
var docBytes = System.IO.File.ReadAllBytes(Path.Combine(dir, docName));
var docStr64 = Convert.ToBase64String(docBytes);
var docBytes64 = Encoding.ASCII.GetBytes(docStr64);

Но ошибка та же самая: ASN1 corrupted data

Что еще можно сделать? Меня удивляет, что проблема именно с файлом, который подписала утилита КриптоПро CryptCp, а не сторонняя программа.


И что же делает написанное?


А, лол, я только внимание обратил на encoding.getbytes
Offline ZiCold  
#11 Оставлено : 22 января 2022 г. 14:58:49(UTC)
ZiCold

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

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

Автор: TolikTipaTut1 Перейти к цитате
Файл пришлите


Файлы:
SignedDocuments.zip (369kb) загружен 2 раз(а).

_SignedByCryptoPro_ - подписан CryptCp, командой -signf
_SignedByDiadoc - подписан библиотекой Диадока, соответственно.

Оба файла с подписями проходят проверку утилитой CryptCp, но _SignedByCryptoPro_ не проходит кодом CoreFx уже на этапе signedCms.Decode(signature);
Offline Андрей *  
#12 Оставлено : 22 января 2022 г. 15:46:17(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Файл пришлите


Файлы:
SignedDocuments.zip (369kb) загружен 2 раз(а).

_SignedByCryptoPro_ - подписан CryptCp, командой -signf
_SignedByDiadoc - подписан библиотекой Диадока, соответственно.

Оба файла с подписями проходят проверку утилитой CryptCp, но _SignedByCryptoPro_ не проходит кодом CoreFx уже на этапе signedCms.Decode(signature);


Еще раз... Декодировать из base64 перед проверкой!
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#13 Оставлено : 22 января 2022 г. 15:47:42(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
Doc_MsgId_13054510_SignedByCryptoPro_CertIncluded.pdf.zip (3kb) загружен 0 раз(а).

этот файл подписи же успешно проходит проверку?
Потому что декодировал его из base64 .sgn
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#14 Оставлено : 22 января 2022 г. 15:59:04(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
написать код, который читает для начала несколько (десятков) байт из файла подписи,
проверяет:
а) начинается на ---- (служебные заголовки - значит из файла нужно извлечь base64, учитывая эту специфику, далее base64 => bin)
б) начинается на M... - (base64 CMS, первый байт "30") - base64 => bin
в) первый байт "30" или "указанная комбинация байт на снимке" - код из asn.1 структуры - вот оно, не нужно декодировать.
Snimok ehkrana ot 2022-01-22 16-58-00.png (43kb) загружен 5 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline ZiCold  
#15 Оставлено : 22 января 2022 г. 17:32:35(UTC)
ZiCold

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

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

Автор: Андрей * Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Файл пришлите


Файлы:
SignedDocuments.zip (369kb) загружен 2 раз(а).

_SignedByCryptoPro_ - подписан CryptCp, командой -signf
_SignedByDiadoc - подписан библиотекой Диадока, соответственно.

Оба файла с подписями проходят проверку утилитой CryptCp, но _SignedByCryptoPro_ не проходит кодом CoreFx уже на этапе signedCms.Decode(signature);


Еще раз... Декодировать из base64 перед проверкой!


Так и делаю. И файл и его подпись. Код:
Код:
var docStr64 = Convert.ToBase64String(docBytes);
            var signStr64 = Convert.ToBase64String(signBytes);
            var docBytes64 = Encoding.ASCII.GetBytes(docStr64);
            var signBytes64 = Encoding.ASCII.GetBytes(signStr64);
            var result = (new Verifier()).VerifySignature(docBytes64, signBytes64);
Offline ZiCold  
#16 Оставлено : 22 января 2022 г. 17:33:16(UTC)
ZiCold

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

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

Автор: Андрей * Перейти к цитате
Doc_MsgId_13054510_SignedByCryptoPro_CertIncluded.pdf.zip (3kb) загружен 0 раз(а).

этот файл подписи же успешно проходит проверку?
Потому что декодировал его из base64 .sgn


Нет, проходит только тот, что был подписан библиотекой Диадока.
Offline ZiCold  
#17 Оставлено : 22 января 2022 г. 17:34:15(UTC)
ZiCold

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

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

Автор: Андрей * Перейти к цитате
написать код, который читает для начала несколько (десятков) байт из файла подписи,
проверяет:
а) начинается на ---- (служебные заголовки - значит из файла нужно извлечь base64, учитывая эту специфику, далее base64 => bin)
б) начинается на M... - (base64 CMS, первый байт "30") - base64 => bin
в) первый байт "30" или "указанная комбинация байт на снимке" - код из asn.1 структуры - вот оно, не нужно декодировать.
Snimok ehkrana ot 2022-01-22 16-58-00.png (43kb) загружен 5 раз(а).


Простите, я вас не понимаю. Не могли бы вы привести пример кода, который это делает?
Offline TolikTipaTut1  
#18 Оставлено : 22 января 2022 г. 17:35:59(UTC)
TolikTipaTut1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 32 раз
Поблагодарили: 30 раз в 27 постах
Автор: ZiCold Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: ZiCold Перейти к цитате
Автор: TolikTipaTut1 Перейти к цитате
Файл пришлите


Файлы:
SignedDocuments.zip (369kb) загружен 2 раз(а).

_SignedByCryptoPro_ - подписан CryptCp, командой -signf
_SignedByDiadoc - подписан библиотекой Диадока, соответственно.

Оба файла с подписями проходят проверку утилитой CryptCp, но _SignedByCryptoPro_ не проходит кодом CoreFx уже на этапе signedCms.Decode(signature);


Еще раз... Декодировать из base64 перед проверкой!


Так и делаю. И файл и его подпись. Код:
Код:
var docStr64 = Convert.ToBase64String(docBytes);
            var signStr64 = Convert.ToBase64String(signBytes);
            var docBytes64 = Encoding.ASCII.GetBytes(docStr64);
            var signBytes64 = Encoding.ASCII.GetBytes(signStr64);
            var result = (new Verifier()).VerifySignature(docBytes64, signBytes64);


Код:
	var signatureBytes = File.ReadAllBytes(_CAdES_BES_SigFileName);
	CmsSignedData cmsSignedData;
	try
	{
		cmsSignedData = new CmsSignedData(signatureBytes);
	}
	catch
	{
		cmsSignedData = new CmsSignedData(Base64.Decode(signatureBytes));
	}


Так делается в BouncyCastle. Не думаю, что в coreFx что-то очень сильно отличается. Пример взят отсюда
Offline Андрей *  
#19 Оставлено : 22 января 2022 г. 22:52:43(UTC)
Андрей *

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

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

Сказал «Спасибо»: 404 раз
Поблагодарили: 1649 раз в 1263 постах
Автор: ZiCold Перейти к цитате
Автор: Андрей * Перейти к цитате
Doc_MsgId_13054510_SignedByCryptoPro_CertIncluded.pdf.zip (3kb) загружен 0 раз(а).

этот файл подписи же успешно проходит проверку?
Потому что декодировал его из base64 .sgn


Нет, проходит только тот, что был подписан библиотекой Диадока.


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