Сертификаты от SmartCard в C#

Опыт показывает, что использование нормы или квадрата нормы в качестве целевой функции алгоритма оптимизации дает аналогичные результаты. Минимальное значение объективной функции изменится, но полученные параметры будут такими же. Я всегда догадывался, что внутренний продукт порождает квадратичную функцию, а корень этого продукта изменил только величину, но не топологию объективной функции. Более подробный ответ можно найти здесь. https://math.stackexchange.com/questions/2253443/difference-between-least-squares-and-minimum-norm-solution Надеюсь, это поможет.

5
задан 19 February 2009 в 16:48
поделиться

2 ответа

Иногда, особенно если Вы не используете ключевое контейнерное имя по умолчанию на смарт-карте (рекомендуемый Microsoft), сертификаты не копируются в локальное хранилище сертификатов. Решение состоит в том, чтобы использовать crypto API, чтобы получить доступ к ключу с KP_CERTIFICATE, создать сертификат из полученных данных и присвоить его, новый RSACryptoServiceProvider создал использование Вашего собственного ключевого контейнерного имени.

Псевдо код C# следует:

int reti = CryptoApi.CryptGetUserKey(_hprovider, keytype, ref userKey);

if (reti)
{
    reti =CryptoApi.CryptGetKeyParam(_userKey, KP_CERTIFICATE, ref  pbdata, ref pwddatalen, 0);
}

if (reti || pwddatalen>0)
{
    byte[] data = new byte[pwddatalen];
    ret  = CryptoApi.CryptGetKeyParam(_userKey, KP_CERTIFICATE, data, ref pwddatalen, 0);
    if (ret) 
    {
        X509Certificate2 c = new X509Certificate2(data);
        X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint, c.Thumbprint, validonly);
        store.Close();

        if (col.Count != 1) 
        {
            //not found in store - CSP didn't copy it
            c.PrivateKey = PrivateKey(keytype);
            return c;
        }
        else
        {
            return col[0];
        }
    }
}


private RSACryptoServiceProvider PrivateKey (KeyType keytype)
{
    CspParameters csparms = new CspParameters();
    csparms.KeyContainerName = _containerName;
    csparms.ProviderName = _provider;
    csparms.ProviderType = 1;
    csparms.Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey;
    csparms.KeyNumber = (int)keytype;

    return new RSACryptoServiceProvider(csparms);
}
3
ответ дан 14 December 2019 в 19:27
поделиться

Необходимо будет пройти Провайдер криптографических служб (CSP) для смарт-карты. В Windows (2000, XP и Vista) любое время Вы вставляете свою смарт-карту в читателя смарт-карты, все сертификаты на нем являются propogated к Вашему персональному хранилищу сертификатов. Ваш закрытый ключ остается на Вашей смарт-карте. То, что это означает, - то, если Вы используете свой сертификат (например, для снабжения цифровой подписью электронного письма) затем, Вам предлагают вставить Вашу смарт-карту. Если Ваша смарт-карта потребует PIN, то Вас попросят ввести ее. Причина этого состоит в том, что существует одно местоположение для приложений для поиска пользовательских сертификатов, персонального хранилища сертификатов, таким образом, приложения не должны быть переписаны только для обработки сертификатов на смарт-картах.

2
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: