Как подписать файл P7Z на C# (.NET 8) с помощью SignedCms? Столкновение с CryptographicException: «Не реализовано»C#

Место общения программистов C#
Ответить
Anonymous
 Как подписать файл P7Z на C# (.NET 8) с помощью SignedCms? Столкновение с CryptographicException: «Не реализовано»

Сообщение Anonymous »

Я пытаюсь реализовать метод на C# с использованием .NET 8 для подписи файла P7Z. Однако при использовании класса SignedCms я сталкиваюсь со следующей ошибкой:
System.Security.Cryptography.CryptographicException: «Не реализовано».
Я просмотрел документацию SignedCms от Microsoft. , но, похоже, это не вносит ясности в этот вопрос. Примеры показывают, что моя реализация правильна, но она не работает должным образом.
Вот код, который у меня есть:

Код: Выделить всё

public void AddSignature(
X509Certificate2 certificate,
Stream inputStream,
Stream outputStream,
bool closeStream
)
{
try
{
// Read and decode the original content
byte[] originalContent = new byte[inputStream.Length];

using (var ms = new MemoryStream())
{
inputStream.CopyTo(ms);
originalContent = ms.ToArray();
}

inputStream.Seek(0, SeekOrigin.Begin);
inputStream.Read(originalContent, 0, (int)inputStream.Length);

var signedCms = new SignedCms();
signedCms.Decode(originalContent);

// Configure the new signer
var signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate)
{
IncludeOption = X509IncludeOption.EndCertOnly
};

// Add signed attributes
signer.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.UtcNow));

// Attempt to add the signature
signedCms.ComputeSignature(signer);

// If the signature was added, save the content
byte[] signedMessage = signedCms.Encode();
outputStream.Write(signedMessage, 0, signedMessage.Length);
outputStream.Flush();
}
finally
{
if (closeStream)
{
outputStream?.Close();
inputStream?.Close();
}
}
}

Метод считывает содержимое входного потока, декодирует его с помощью SignedCms.Decode, а затем пытается добавить подпись с помощью ComputeSignature.
Сертификат представляет собой объект X509Certificate2 и работает в других сценариях подписи.
Я использую .NET 8, и мой вариант использования требует подписи файлов в формате P7Z.
Есть ли что-то особенное в Формат P7Z или SignedCms, требующий дополнительной настройки?
Может ли проблема быть связана с изменениями в .NET 8 или отсутствием поддержки определенных криптографических операций?
Существуют ли альтернативные подходы или библиотеки для подписи файлов P7Z в .NET 8?
Будем очень признательны за любую информацию или рекомендации!
Проверено, что X509Certificate2 действителен и пригоден для использования.
Подтверждено, что содержимое в SignedCms.Decode корректен и правильно отформатирован.
Проверил документацию и другие примеры, которые показывают, что метод ComputeSignature должен работать так, как реализовано.
Я также пробовал использовать BouncyCastle для создания отдельная подпись, но поскольку мой сертификат подписи RSA настроен только для подписи документов, он не включает закрытый ключ, необходимый для операций подписи.
Файл, который мне нужно подписать, очень большой (более 100 МБ).
Я реализовал аналогичное решение в более ранней версии SignedCms с .NET Framework 3.5, и оно работает с файлами меньшего размера, но теперь мне нужно обрабатывать файлы размером не менее 1 ГБ.
Текущая версия реализация, похоже, имеет ограничения по производительности или памяти для файлов большего размера в .NET 8.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ptographic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»