C# подписать данные ECDSA со смарт-карты - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь подписать некоторые данные с помощью закрытого ключа смарт-карты. Ключевой алгоритм - ECDSA. когда я пытаюсь получить объект закрытого ключа, возникает исключение, не поддерживаемое системой. enter image description here

Затем, после некоторых исследований, я узнал, что X509Certificate2 не поддерживает ключи E C.

sysSec.X509Certificate2 cert = CertHelper.GetSignCertificate(serialNumber); //Get Certificate from Store var

key = cert.PrivateKey;

Затем я пытаюсь использовать библиотеку Bouncy Castle. Но здесь я не мог получить ECPrivateKeyParameters после синтаксического анализа X509Certificate2. Есть код:

 byte[] pkcs12Bytes = cert.Export(sysSec.X509ContentType.Pkcs12,"test");

            Pkcs12Store pkcs12 = new Pkcs12StoreBuilder().Build();
            pkcs12.Load(new MemoryStream(pkcs12Bytes, false), "test".ToCharArray());


            ECPrivateKeyParameters privKey = null;
            foreach (string alias in pkcs12.Aliases)
            {
                if (pkcs12.IsKeyEntry(alias))
                {
                    privKey = (ECPrivateKeyParameters)pkcs12.GetKey(alias).Key;
                    break;
                }
            }

Тоже не работает. Но когда я создаю файл CMS, происходят странные вещи. Оно работает.

  public  byte[] Sign(byte[] data , X509Certificate2 certificate ,bool detached )
        {

            if (data == null)
                throw new ArgumentNullException("data");
            if (certificate == null)
                throw new ArgumentNullException("certificate");

            // setup the data to sign
           // ContentInfo content = new ContentInfo( new Oid("1.3.14.3.2.26"), data);
            ContentInfo content = new ContentInfo( data);
            SignedCms signedCms = new SignedCms(content, detached);

            CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);

            signer.SignedAttributes.Add(new Pkcs9DocumentName("testname"));
            signer.SignedAttributes.Add(new Pkcs9SigningTime());
            //signer.;

            // CmsRecipientCollection recipest =new CmsRecipientCollection ()
            // create the signature


            signedCms.ComputeSignature(signer);
           // signedCms.ComputeSignature()
            byte[] res =  signedCms.Encode();
            foreach (SignerInfo info in signedCms.SignerInfos)
            {

                foreach (var item in info.SignedAttributes)
                {
                    string frname = item.Oid.FriendlyName ?? "null";
                    Console.WriteLine(string.Format(" OID {0}  : Value {1}", frname, item.Oid.Value.ToString()));
                }

                foreach (var item in info.UnsignedAttributes)
                {
                    string frname = item.Oid.FriendlyName ?? "null";
                    Console.WriteLine(string.Format(" OID {0}  : Value {1}", frname, item.Oid.Value.ToString()));
                }
            }
            Console.WriteLine("Signed !");
            return res; 
        }

Так кто-нибудь знает как с этим обращаться? Также как подписаться со смарт-карты с помощью Bouncy Castle?

1 Ответ

0 голосов
/ 19 июня 2020

Насколько я понимаю, BouncyCastle - это криптографическая c библиотека. Он может что-то подписать, если вы предоставите ключ. Однако смарт-карты обычно не экспортируют закрытые ключи (поэтому у меня есть некоторые сомнения, содержит ли ваш сертификат сертификат смарт-карты), но я ожидаю, что команды будут что-то подписывать, например, получая соответствующее значение ha sh и возвращая подпись ( после обеспечения соответствующей аутентификации пользователя).

Обычно это выполняется с использованием интерфейса PKCS # 11 (предполагается, что у вас есть драйвер для него, соответствующий набору команд вашей карты) или путем отправки соответствующих командных APDU непосредственно на карту (довольно сложно) из вашего приложения. Я ничего не нашел на веб-сайте надувного замка, предполагая, что есть некоторая поддержка адресации смарт-карт. (Он может быть скрыт в функциональности OpenPGP, если ваша карта соответствует этому стандарту.)

Так что без знакомства с BouncyCastle мне кажется, что он не будет соответствовать вашим ожиданиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...