Ответы пользователя по тегу Криптография
  • Программная работа с ЭЦП

    Juralis
    @Juralis
    К сожалению, 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
    Ответ написан