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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline knik85  
#1 Оставлено : 13 февраля 2025 г. 16:12:51(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Может ли плагин криптопро подписывать документы как криптопроPDF?
Offline Андрей *  
#2 Оставлено : 13 февраля 2025 г. 16:57:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2250 раз в 1756 постах
Автор: knik85 Перейти к цитате
Может ли плагин криптопро подписывать документы как криптопроPDF?


подписывается вычисленный хеш,
задача бэка - правильно подготовить pdf, а потом вставить отсоединенную ЭП полученную с клиента (от плагина или другого ПО) и получить в итоге pdf с встроенной ЭП (PAdES).

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
knik85 оставлено 13.02.2025(UTC)
Offline knik85  
#3 Оставлено : 14 февраля 2025 г. 11:46:04(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Спасибо за ответ. Попробовал, но в pdf подпись получается недействительной. Нет случайно ссылок на документацию с таким примером?
Offline knik85  
#4 Оставлено : 14 февраля 2025 г. 15:34:36(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: knik85 Перейти к цитате
Может ли плагин криптопро подписывать документы как криптопроPDF?


подписывается вычисленный хеш,
задача бэка - правильно подготовить pdf, а потом вставить отсоединенную ЭП полученную с клиента (от плагина или другого ПО) и получить в итоге pdf с встроенной ЭП (PAdES).



using com.itextpdf.text.pdf.security;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;

class Program
{
static void Main(string[] args)
{
string inputPdf = "C:\\Тест подписи.pdf"; // Исходный PDF
string outputPdf = "C:\\Тест подписи_signed.pdf"; // Подписанный PDF
string outputPdf_2 = "C:\\Тест подписи_signed_2.pdf"; // Подписанный PDF
string hashFile = "C:\\Тест подписи.hash"; // Файл хеша
string signatureFile = "C:\\Тест подписи.hash.sign"; // Подпись от CryptoPro

byte[] hash = PrepareSignatureAndGetHash(inputPdf, outputPdf);
File.WriteAllBytes(hashFile, hash);

//Хеш(в виде текстового файла) подписывается в криптопро и далее выполнение кода продолжается
Console.ReadLine();

byte[] sig = Convert.FromBase64String(File.ReadAllText(signatureFile));
SigSignature(outputPdf, outputPdf_2, sig);
}

// Function to get the hash for the signature
static byte[] PrepareSignatureAndGetHash(string inputPdf, string outputPdf)
{
var hash = string.Empty;

using (var reader = new PdfReader(inputPdf))
{
using (var fileStream = File.OpenWrite(outputPdf))
{
using (var stamper = PdfStamper.CreateSignature(reader, fileStream, '0', null, true))
{
var signatureAppearance = stamper.SignatureAppearance;
signatureAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 200, 200), 1, "NewSignature");

PdfName filterName = new PdfName("CryptoPro PDF");
IExternalSignatureContainer external = new ExternalBlankSignatureContainer(filterName, PdfName.ADBE_PKCS7_DETACHED);
signatureAppearance.Reason = "Подпись Тест";
signatureAppearance.Layer2Text = "Подпись Тест";
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;

MakeSignature.SignExternalContainer(signatureAppearance, external, 8192);

byte[] buff = DigestAlgorithms.Digest(signatureAppearance.GetRangeStream(), "SHA256");


//Stream s = signatureAppearance.GetRangeStream();
//MemoryStream ss = new MemoryStream();

//int read = 0;
//while ((read = s.Read(buff, 0, 8192)) > 0)
//{
// ss.Write(buff, 0, read);
//}
return buff;
}
}
}


}

// Function to apply the external signature to the PDF
static void SigSignature(string inputPdf, string outputPdf, byte[] sig)
{
using (var reader = new PdfReader(inputPdf))
{
using (var fileStream = File.OpenWrite(outputPdf))
{
IExternalSignatureContainer external = new MfuaExternalSignatureContainer(sig);
MakeSignature.SignDeferred(reader, "NewSignature", fileStream, external);


}
}
}

// Custom implementation of IExternalSignatureContainer
class MfuaExternalSignatureContainer : IExternalSignatureContainer
{
private readonly byte[] _signedBytes;

public MfuaExternalSignatureContainer(byte[] signedBytes)
{
_signedBytes = signedBytes;
}

public byte[] Sign(Stream data)
{
return _signedBytes; // Returning pre-signed bytes
}

public void ModifySigningDictionary(PdfDictionary signDic)
{
// signDic.Put(PdfName.FILTER, new PdfName("CryptoPro PDF"));
}
}

}


1. Подготавливаю файл и выгружаю хеш
2. Подписываю хеш в криптопро
3. Вставляю подпись
Ошибки:
подпись не определена;
документ был изменён;
сертификат определяет, но пишет, что ненадёжный.

Отредактировано пользователем 14 февраля 2025 г. 16:41:14(UTC)  | Причина: Не указана

Offline Андрей *  
#5 Оставлено : 14 февраля 2025 г. 17:11:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2250 раз в 1756 постах
SHA256?
Техническую поддержку оказываем тут
Наша база знаний
Offline knik85  
#6 Оставлено : 14 февраля 2025 г. 17:28:10(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
SHA256?


т.е. там должен быть хеш по ГОСТ Р 34.11-2012, 256 бит?
Offline Андрей *  
#7 Оставлено : 14 февраля 2025 г. 17:37:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 554 раз
Поблагодарили: 2250 раз в 1756 постах
Автор: knik85 Перейти к цитате
Автор: Андрей * Перейти к цитате
SHA256?


т.е. там должен быть хеш по ГОСТ Р 34.11-2012, 256 бит?


риторические вопросы... код откуда?

здесь на форуме есть такой же, поискать по ключевым названиям функций.
Техническую поддержку оказываем тут
Наша база знаний
Offline knik85  
#8 Оставлено : 14 февраля 2025 г. 18:07:00(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: knik85 Перейти к цитате
Автор: Андрей * Перейти к цитате
SHA256?


т.е. там должен быть хеш по ГОСТ Р 34.11-2012, 256 бит?


риторические вопросы... код откуда?

здесь на форуме есть такой же, поискать по ключевым названиям функций.




Понял, спасибо большое. поищу по форуму. Код из интернета.
Offline knik85  
#9 Оставлено : 14 февраля 2025 г. 18:22:07(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: knik85 Перейти к цитате
Автор: Андрей * Перейти к цитате
SHA256?


т.е. там должен быть хеш по ГОСТ Р 34.11-2012, 256 бит?


риторические вопросы... код откуда?

здесь на форуме есть такой же, поискать по ключевым названиям функций.



Подскажите ещё пожалуйста в Криптопро NET этот код подойдёт для создания хеша?

// Создаем объект для хэширования.
HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");

// Открываем входной файл и считываем его содержимое в буфер.
byte[] buffer = null;
using (FileStream inStream = new FileStream(sourceFile,
FileMode.Open, FileAccess.Read))
{
if (inStream.Length > int.MaxValue)
{
Console.WriteLine("Файл слишком большой.");
return;
}
buffer = new byte[inStream.Length];
inStream.Read( buffer, 0, (int)inStream.Length );
}

// Вычисляем хэш от всех прочитанных данных.
byte[] hashValue = myhash.ComputeHash(buffer);
Offline knik85  
#10 Оставлено : 17 февраля 2025 г. 17:22:30(UTC)
knik85

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: knik85 Перейти к цитате
Автор: Андрей * Перейти к цитате
SHA256?


т.е. там должен быть хеш по ГОСТ Р 34.11-2012, 256 бит?


риторические вопросы... код откуда?

здесь на форуме есть такой же, поискать по ключевым названиям функций.


Я думаю, что Вы сами не знаете как сделать поэтому и отвечаете так туманно, код
который на форуме я нашёл не работает. Сначала говорят, что нужно подписывать хеш,
но в итоге подписывают весть контент pdf файла и говорят, что так работает. Видимо
этот код уже старый достаточно. Но в любом случае спасибо.

Отредактировано пользователем 17 февраля 2025 г. 17:24:37(UTC)  | Причина: Не указана

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