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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline lexmove  
#1 Оставлено : 26 марта 2014 г. 10:43:51(UTC)
lexmove

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

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

Сказал(а) «Спасибо»: 2 раз
Создаю подпись
Цитата:

byte[] data = System.Text.Encoding.UTF8.GetBytes(xmldata.XML);

// Формируем коллекцию отображаемых сертификатов.
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection =
(X509Certificate2Collection)store.Certificates;

// Отображаем окно выбора сертификата.
X509Certificate2Collection scollection =
X509Certificate2UI.SelectFromCollection(collection,
"Выбор секретного ключа по сертификату",
"Выберите сертификат соответствующий Вашему секретному ключу.",
X509SelectionFlag.SingleSelection);

// Проверяем, что выбран сертификат
if (scollection.Count == 0)
{
Console.WriteLine("Не выбран ни один сертификат.");
return null;
}

// Выбран может быть только один сертификат.
X509Certificate2 found = scollection[0];

Gost3410CryptoServiceProvider prov = (Gost3410CryptoServiceProvider)found.PrivateKey;

// Объект, реализующий алгоритм хэширования.
Gost3411CryptoServiceProvider myhash = new Gost3411CryptoServiceProvider();

using (MemoryStream stream = new MemoryStream(data))
{
myhash.ComputeHash(stream);
}
byte[] signature1 = prov.SignHash(myhash.Hash);
string sign = Convert.ToBase64String(signature1);



Переменную sign записываю в файл 1111.crt. Только данная переменная сейчас в формате Base64, как сделать кодировку DER. При проверке в КриптоАРМ выдает сообщение "Расшифрованный файл не является подписью (0x80070057)"
Online Андрей Писарев  
#2 Оставлено : 26 марта 2014 г. 11:22:58(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2252 раз в 1757 постах
Ответ: не использовать конвертирование в base64.
убрать из кода: Convert.ToBase64String
как записать byte[] в файл - написано в учебнике (MSDN).


P.s. Надеюсь Вам известно, что делает SignHash.
И какой на выходе результат.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
lexmove оставлено 26.03.2014(UTC)
Offline lexmove  
#3 Оставлено : 26 марта 2014 г. 11:41:24(UTC)
lexmove

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

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

Сказал(а) «Спасибо»: 2 раз
Цитата:
using (MemoryStream stream = new MemoryStream(data))
{
myhash.ComputeHash(stream);
}
byte[] signature1 = prov.SignHash(myhash.Hash);

ZipFile x = new ZipFile();
x.AddEntry("sign.xml", xmldata.XML, Encoding.UTF8);
x.AddEntry("sign.xml.crt", signature1);


Все равно выдает ту же ошибку! Подписал этот файл через КриптоАРМ, открыл подпись, там есть инфа про сертификат подписавшего... Мне по видимому тоже это надо как-то добавить?

Отредактировано пользователем 26 марта 2014 г. 11:44:04(UTC)  | Причина: Не указана

Online Андрей Писарев  
#4 Оставлено : 26 марта 2014 г. 12:01:03(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2252 раз в 1757 постах
Автор: lexmove Перейти к цитате
Цитата:
using (MemoryStream stream = new MemoryStream(data))
{
myhash.ComputeHash(stream);
}
byte[] signature1 = prov.SignHash(myhash.Hash);

ZipFile x = new ZipFile();
x.AddEntry("sign.xml", xmldata.XML, Encoding.UTF8);
x.AddEntry("sign.xml.crt", signature1);


Все равно выдает ту же ошибку! Подписал этот файл через КриптоАРМ, открыл подпись, там есть инфа про сертификат подписавшего... Мне по видимому тоже это надо как-то добавить?


Описание смотрели?

Нужно читать и делать CMS, чтобы проверять в КриптоАРМ.
http://cpdn.cryptopro.ru...57-a704-1424adb9ae46.htm
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
lexmove оставлено 26.03.2014(UTC)
Offline lexmove  
#5 Оставлено : 26 марта 2014 г. 12:31:31(UTC)
lexmove

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

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

Сказал(а) «Спасибо»: 2 раз
Переделал

Цитата:
X509Certificate2 found = scollection[0];

ContentInfo contentInfo = new ContentInfo(data);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(found);
try
{
signedCms.ComputeSignature(cmsSigner,false);
}
catch { }
byte[] signdetachted = signedCms.Encode();

ZipFile x = new ZipFile();
x.AddEntry("sign.xml", xmldata.XML, Encoding.UTF8);
x.AddEntry("sign.xml.crt", signdetachted);



КриптоАРМ выдает ошибку "Одна или несколько подписей некорректна или нет доверия". Притом стандартную программную проверку (Verify) проходит Успешно.

Отредактировано пользователем 26 марта 2014 г. 16:43:05(UTC)  | Причина: Не указана

Вложение(я):
Test.zip (7kb) загружен 2 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline lexmove  
#6 Оставлено : 27 марта 2014 г. 12:41:32(UTC)
lexmove

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

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

Сказал(а) «Спасибо»: 2 раз
Если при подписи добавить байты кодировки utf8

Цитата:
byte[] utf8 = { 239, 187, 191 };
ArrayList ar = new ArrayList();
ar.AddRange(utf8);
ar.AddRange(data3);
byte[] data = new byte[ar.Count];
data = (byte[])ar.ToArray(typeof(byte));

ContentInfo contentInfo = new ContentInfo(data);


То в КриптоАРМ все проверяет нормально, но при программной проверке тоже придется добавлять данные байты. Просто КриптоАРМ загружает физические файлы(присутствуют данные байты)
Цитата:
byte[] data1 = System.IO.File.ReadAllBytes("C:/Users/Александр/700.xml");

а я работаю с потоками(там нет этих байтов)

Как этого избежать? Хотелось бы проверять и программно и КриптоАРМ.

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

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