Как использовать сертификаты Windows Personal User в C # для подписи произвольной строки

#c# #cryptography

#c# #криптография

Вопрос:

Я хотел бы написать небольшую программу, которая подписывает строку сертификатом личного пользователя Windows.

Я обнаружил, что это CAPICOM было решением, но теперь это устаревшее и совместимое только с 32-битным решением.

В идеале я хотел бы что-то вроде:

  digest = sign(string, 'myWindowsCertificate');
  

Ответ №1:

Вы могли бы просто использовать System.Security.Cryptography .

Давайте представим, что вы хотите подписать с помощью WISeKey ключа, присутствующего в вашем хранилище:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

            store.Open(OpenFlags.ReadOnly);

            foreach (var cert in store.Certificates)
            {
                string desc = cert.GetNameInfo(X509NameType.SimpleName, true);
                if (desc.Contains("WISeKey"))
                {
                    RSA pk = cert.GetRSAPrivateKey();                    
                    byte[] buffer = Encoding.Default.GetBytes("Hello World ... !");
                    byte[] signature = pk.SignData(buffer, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                    System.Console.WriteLine(BitConverter.ToString(signature));                  

                    break;
                }                
            }
            Console.ReadLine();
        }
    }
}