К сожалению, C# не знаю, могу поделиться своей функцией на IronPython. Порядок действий, классы и методы будут одинаковые.
from System.Security.Cryptography import Pkcs
from System.Security.Cryptography.X509Certificates import X509Store, OpenFlags, X509Certificate2Collection,\
X509Certificate2, X509Certificate2UI, StoreName
def sign(content, tp):
store = X509Store(StoreName.My)
store.Open(OpenFlags.ReadOnly)
storecollection = X509Certificate2Collection(store.Certificates)
myCert = None
for cert in storecollection:
if cert.Thumbprint.ToLower == tp.ToLower:
myCert = cert
if not myCert:
return None
else:
contentInfo = Pkcs.ContentInfo(content)
signedCms = Pkcs.SignedCms(contentInfo, True)
cmsSigner = Pkcs.CmsSigner(myCert)
signedCms.ComputeSignature(cmsSigner)
sign = signedCms.Encode()
return sign
Соответственно, тут на входе байты файла и строка с отпечатком (Tumbprint, его можно посмотреть в свойствах сертификата, но если захотите скопировать прямо от туда, то нужно убрать пробелы)
Вместо передачи отпечатка можно прямо просить выбрать сертификат. У класса X509Certificate2UI есть метод SelectFromCollection, который показывает стандартное окошко выбора сертификата и возвращает коллекцию с выбранными сертификатами.
Касательно того, что это криптопровайдер от КриптоПро — в общем-то, в данном случае не имеет значения.
Ну, соответственно, остаётся прочитать файл и сохранить байты подписи в имя_файла.sig