Closed UseMuse closed 3 months ago
using GostCryptography.Config;
using GostCryptography.Pkcs;
using Org.BouncyCastle.Utilities.IO.Pem;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
class Program
{
static void Main(string[] args)
{
string pdfFileName = "файл.pdf";
string signatureFileName = "файл.pdf.sig";
string filesDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "files");
string pdfFilePath = Path.Combine(filesDirectory, pdfFileName);
string signatureFilePath = Path.Combine(filesDirectory, signatureFileName);
// Чтение содержимого файлов
byte[] pdfBytes = File.ReadAllBytes(pdfFilePath);
string pemData = File.ReadAllText(signatureFilePath);
// Извлечение CMS данных
PemObject pemObject = new PemReader(new StringReader(pemData)).ReadPemObject();
byte[] cmsBytes = pemObject.Content;
// Декодирование и проверка подписи
VerifySignature(pdfBytes, cmsBytes);
}
static void VerifySignature(byte[] pdfBytes, byte[] cmsBytes)
{
// Создание объекта ContentInfo для проверки подписи файла PDF
ContentInfo contentInfo = new ContentInfo(pdfBytes);
GostSignedCms signedCms = new GostSignedCms(SubjectIdentifierType.SubjectKeyIdentifier,contentInfo, true);
signedCms.Decode(cmsBytes);
// Проверяем число основных и дополнительных подписей
Console.WriteLine();
Console.WriteLine("Количество подписавших: {0}", signedCms.SignerInfos.Count);
if (signedCms.SignerInfos.Count == 0)
{
Console.WriteLine("Документ не подписан.");
return;
}
bool valid = true;
foreach (SignerInfo signer in signedCms.SignerInfos)
{
X509Certificate2 certificate = signer.Certificate;
if (certificate != null)
Console.Write("Проверка подписи для подписавшего '{0}'...", certificate.SubjectName.Name);
else
Console.Write("Проверка подписи для подписавшего без сертификата...");
try
{
signer.CheckSignature(false);
Console.WriteLine("Успешно.");
}
catch (CryptographicException e)
{
Console.WriteLine("Ошибка:");
Console.WriteLine("\t" + e.Message);
valid = false;
}
// Проверка соподписей, если есть
foreach (SignerInfo counterSigner in signer.CounterSignerInfos)
{
X509Certificate2 counterCertificate = counterSigner.Certificate;
if (counterCertificate != null)
Console.Write("\tПроверка соподписи для соподписавшего '{0}'...", counterCertificate.SubjectName.Name);
else
Console.Write("\tПроверка соподписи для соподписавшего без сертификата...");
try
{
counterSigner.CheckSignature(false);
Console.WriteLine("Успешно.");
}
catch (CryptographicException e)
{
Console.WriteLine("Ошибка:");
Console.WriteLine("\t\t" + e.Message);
valid = false;
}
}
}
Console.WriteLine();
if (valid)
Console.WriteLine("Проверка PKCS #7 сообщения завершилась успешно.");
else
Console.WriteLine(
"Проверка PKCS #7 сообщения завершилась неудачно." +
"Возможно сообщение, одна из подписей, или соподписей " +
"модифицированы в процессе передачи или хранения. " +
"Возможно, что не корректен или подменен один из " +
"сертификатов подписывающих. Возможно подписывающий " +
"не имеет соответствующих атрибутов для подписи. " +
"Достоверность и/или целостность сообщения не гарантируется.");
}
}
подскажите хоть что-нибудь, буду очень благодарен
Здравствуйте!
Спасибо за обратную связь. К сожалению, пока поддерживается только .NET Framework и ОС Windows. Для новых версиий .NET, начиная с v5, пока поддержки нет. Там существенно переработали внутренности Security и практически полностью отказались от CryptoAPI.
Подобный запрос на доработку уже добавлен. Очевидно, мне нужно вернуться к работе над этим. :) Сейчас могу посоветовать только переключиться с .NET на .NET Framework, если это приемлемо.
Добрый вечер! Использую net8.0 и
как применить Gost_R3411_2012_256... ?
на строке signer.CheckSignature(false); получаю ошибку Unknown algorithm '1.2.643.7.1.1.1.1' Помогите пожалуйста