Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Проверка присоединенной подписи ГОСТ Р 34.10-2012 в подписанном pdf-файле
Статус: Участник
Группы: Участники
Зарегистрирован: 15.06.2017(UTC) Сообщений: 13
|
Добрый день. Высылаю скрин командной строки. В d:\1\ - находиться подписанный файл oshibka.png (9kb) загружен 24 раз(а).
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2019(UTC) Сообщений: 5
|
Автор: Артём Макаров Добрый день. Попробуйте данный пример (вложение). NewDotNetPdfVerify.cs (6kb) загружен 84 раз(а). Также перешли на ГОСТ 2012. Для проверки валидности пользуемся указанным примером. Но не знаю как получить Причину (REASON) и Место (LOCATION), добавленные нами в подпись. Добавляли в PdfSinnatureAppearance. Приведите, пожалуйста, пример кода для получения значений REASON и LOCATION. Спасибо.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 205
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 54 раз в 53 постах
|
Получение LOCATION и REASON Код:// PdfDictionary singleSignature, получение - см. пример
PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON);
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2019(UTC) Сообщений: 5
|
Автор: Артём Макаров Получение LOCATION и REASON Код:// PdfDictionary singleSignature, получение - см. пример
PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON);
Спасибо, это я мог получить и ранее. Однако, она закодирована. Раскодировать как для сертификата (в Вашем примере выше): // Декодируем подпись signedCms.Decode(signatureBytes); не получается. Хоть и подставлял location.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 205
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 54 раз в 53 постах
|
Кто "она"? Что значит "Раскодировать как для сертификата"?
Какой метод не отрабатывает? Ошибка в signedCms.Decode? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2019(UTC) Сообщений: 5
|
Автор: Артём Макаров Кто "она"? Что значит "Раскодировать как для сертификата"?
Какой метод не отрабатывает? Ошибка в signedCms.Decode? Код:
namespace _666
{
class Program
{
static void Main(string[] args)
{
PdfReader reader = null;
reader = new PdfReader("C:\\DISTRIB\\1.pdf");
// Получаем подписи из документа
AcroFields af = reader.AcroFields;
List<string> names = af.GetSignatureNames();
foreach (string name in names)
{
string message = "Signature name: " + name;
message += "\nSignature covers whole document: " + af.SignatureCoversWholeDocument(name);
message += "\nDocument revision: " + af.GetRevision(name) + " of " + af.TotalRevisions;
// Проверяем подпись
PdfDictionary singleSignature = af.GetSignatureDictionary(name);
//PdfString asString1 = singleSignature.GetAsString(PdfName.CONTENTS);
/////////////////////
//Указываю LOCATION//
////////////////////
PdfString asString1 = singleSignature.GetAsString(PdfName.LOCATION);
//далее все в точности как по примеру
byte[] signatureBytes = asString1.GetOriginalBytes();
RandomAccessFileOrArray safeFile = reader.SafeFile;
PdfArray asArray = singleSignature.GetAsArray(PdfName.BYTERANGE);
using (
Stream stream =
(Stream)
new RASInputStream(
new RandomAccessSourceFactory().CreateRanged(
safeFile.CreateSourceView(),
(IList<long>)asArray.AsLongArray())))
{
using (MemoryStream ms = new MemoryStream((int)stream.Length))
{
stream.CopyTo(ms);
byte[] data = ms.GetBuffer();
// Создаем объект ContentInfo по сообщению.
// Это необходимо для создания объекта SignedCms.
ContentInfo contentInfo = new ContentInfo(data);
// Создаем SignedCms для декодирования и проверки.
SignedCms signedCms = new SignedCms(contentInfo, true);
// Декодируем подпись
signedCms.Decode(signatureBytes);
bool checkResult;
try
{
signedCms.CheckSignature(true);
checkResult = true;
}
catch (Exception)
{
checkResult = false;
}
message += "\nDocument modified: " + !checkResult;
foreach (var sinerInfo in signedCms.SignerInfos)
{
message += "\nCertificate " + sinerInfo.Certificate;
X509Certificate2 cert = signedCms.Certificates[0];
var isCapiValid = cert.Verify();
message += "\nCAPI Validation: " + isCapiValid.ToString();
foreach (var attribute in sinerInfo.SignedAttributes)
{
if (attribute.Oid.Value == "1.2.840.113549.1.9.5")
{
Pkcs9SigningTime signingTime = attribute.Values[0] as Pkcs9SigningTime;
message += "\nDate: " + signingTime.SigningTime;
}
}
message += "\n\n";
}
Console.WriteLine(message);
Console.ReadKey();
}
}
}
}
}
}
>>Какой метод не отрабатывает? Ошибка в signedCms.Decode? Да, ошибка именно на signedCms.Decode(signatureBytes)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 205
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 54 раз в 53 постах
|
Вы пытаетесь проверить строку, содержащую LOCATION, как подпись. Очевидно, при декодировании строки как подписи вы получаете ошибку. Проверить надо, как и раньше, подпись (asString1). В location у вас текстовое представление LOCATION, указанное при подписи. В декодировании оно не нуждается, можно использовать метод .ToString() Код:
// ...
string message = "Signature name: " + name;
message += "\nSignature covers whole document: " + af.SignatureCoversWholeDocument(name);
message += "\nDocument revision: " + af.GetRevision(name) + " of " + af.TotalRevisions;
Console.WriteLine(message);
// Проверяем подпись
PdfDictionary singleSignature = af.GetSignatureDictionary(name);
PdfString asString1 = singleSignature.GetAsString(PdfName.CONTENTS);
byte[] signatureBytes = asString1.GetOriginalBytes();
RandomAccessFileOrArray safeFile = reader.SafeFile;
// Получение location и reason
PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON);
// произвольный код работы с location и reason
PdfArray asArray = singleSignature.GetAsArray(PdfName.BYTERANGE);
using (Stream stream = (Stream)new RASInputStream(
// ...
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2019(UTC) Сообщений: 5
|
2PDF.jpg (19kb) загружен 14 раз(а). 1PDF.jpg (188kb) загружен 14 раз(а).Возможно я крайне невыразительно формулирую свои вопросы, но прошу помощи. Вот подпись, и в ней, например REASON = Сдал. Однако, я вместо "Сдал", получаю крикозябли. Я полагал, что это связано с применением нового ГОСТ 2012, так как на 2001 у меня все работало. Прошу Вас помочь с ответом, как получить "Сдал"?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 205
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 54 раз в 53 постах
|
Похоже проблема с кодировкой. С ГОСТом это вряд ли связано.
Попробуйте вызвать метод "reason.ToUnicodeString();" или получить массив через GetBytes (или GetOriginalBytes) и декодировать массив вручную. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2019(UTC) Сообщений: 5
|
Автор: Артём Макаров Похоже проблема с кодировкой. С ГОСТом это вряд ли связано.
Попробуйте вызвать метод "reason.ToUnicodeString();" или получить массив через GetBytes (или GetOriginalBytes) и декодировать массив вручную. Благодарю!!! reason.ToUnicodeString() - заработал. Огромное спасибо!!!
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Проверка присоединенной подписи ГОСТ Р 34.10-2012 в подписанном pdf-файле
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close