Программирование смарт-карт на C#

Как мне начать программировать смарт-карты на C# (.NET)? Для начала мне просто нужно знать, как называется картридер (например, Omnikey) и распечатать его.

Спасибо за ответ, Алесь.


person Thorusan86    schedule 31.01.2011    source источник


Ответы (4)


Некоторое время назад мне пришлось написать то, что, как я думал, должно было стать простым и легким кодом смарт-карты, и позвольте мне сказать вам, что это была не прогулка в парке. Во-первых, оказалось, что хорошую информацию о смарт-картах трудно найти в Сети. И когда я нашел несколько веб-сайтов, было много обсуждений базовых вызовов Win32 API и куча других низкоуровневых вещей, которые не совсем легко читать.

Дело в том, что они называются смарт-картами не просто так. Причина в том, что вы в основном взаимодействуете со встроенным микропроцессором, посылая ему команды, которые он понимает и на которые реагирует. Это может быть немного сложно, потому что многие производители считают хорошей идеей реализовать свои собственные команды, поэтому многое зависит от типа используемой карты. Кроме того, есть карты, которые выглядят как смарт-карты, но на самом деле не являются смарт-картами и даже не используют какой-либо из «стандартных» интерфейсов смарт-карт, поэтому в конечном итоге вы используете Windows SmartCard API только для запуска своего ридера, а специальный API для чтения смарт-карт, предоставленный в виде .lib в каком-то неясном уголке их веб-сайта для остальных...

Что ж, в конце концов мое приложение заработало, но, как я уже сказал, это было непросто. Во всяком случае, я совершил большую ошибку, полагая, что это будет не очень трудно сделать.

Если вы действительно хотите заняться смарт-картами, я полагаю, что вам лучше всего было бы найти хорошую книгу по этому вопросу, но, поскольку я тоже немного больше, чем новичок, я действительно не могу вам помочь.

Что касается веб-сайтов, самое полезное в терминах C#, которое мне удалось найти, это смарт-карта. Фреймворк для .Net. Обратите внимание, что это не та статья, которую опубликовал michaelvdnest, хотя автор тот же. В статье, на которую я ссылаюсь, описывается оболочка C# для собственного API смарт-карт, в то время как michaelvdnest добавляет в смесь XML, хотя я точно не знаю, каким образом, потому что еще не читал ее.

Так что начните анализировать код, прилагаемый к статье, и удачи. Если мне не изменяет память, перечисление читателей довольно легко найти.

person dandan78    schedule 31.01.2011
comment
Большое спасибо за этот длинный ответ :) мой коллега уже сказал мне, что мне предстоит долгий путь ... и он тоже не смог мне помочь. Что ж, теперь я знаю, что это можно сделать, и спасибо за ссылку, я уже нашел ее и сейчас читаю и обрабатываю. - person Thorusan86; 01.02.2011
comment
@sql Вы не новичок в Stackoverflow. Задайте новый вопрос. - person dandan78; 25.01.2012
comment
Ты же не шутишь, что это не прогулка в парке. Один из наших разработчиков ранее внедрил код на основе упомянутой статьи, поэтому чтение карты не представляет для меня проблемы, но я изо всех сил пытаюсь понять, как выполнить аутентификацию, чтобы позволить мне считывать защищенные данные с европейских карт цифровых тахографов. Чтение спецификации немного похоже на плавание в грязи. - person Steve Crane; 25.05.2012
comment
Недавно приняв отравленную чашу необходимости программировать смарт-карту, я не могу вспомнить, когда в последний раз приходил на работу в таком подавленном состоянии... - person Fetchez la vache; 21.11.2014

Ознакомьтесь с Smart Card Framework для .NET в Code Project. Он описывает структуру XML для .NET для программирования приложений смарт-карт.

person michaelvdnest    schedule 31.01.2011
comment
Я уже сделал это, и я все еще работаю над этим. Благодарность! :) - person Thorusan86; 01.02.2011
comment
Это тот же парень, но новее: codeproject. com/Articles/16653/A-Smart-Card-Framework-for-NET - person VoteCoffee; 07.11.2014

Я знаю, что уже поздно.....

но

Вы можете получить очень простую в использовании и бесплатную для личного пользования профессиональную библиотеку здесь:

https://www.smartcard-api.com/

Здесь также есть библиотека смарт-карт сообщества (полностью бесплатная для использования).

https://www.nuget.org/packages/PCSC

В последние годы я предпочитал использовать Nu-get, а не API смарт-карт, если вам нужна коммерческая поддержка, однако библиотека API смарт-карт — лучший выбор.

Как только вы это сделаете, вам нужно начать понимать APDU и как перемещать их туда и обратно с карты на терминал.

Это действительно огромная тема для обсуждения, у меня есть код, который будет считывать все общие элементы на стандартной карте EMV Chip & Pin, к сожалению, он был написан для клиента, предоставляющего финансовые услуги, поэтому я не могу вам его дать, но я могу объяснить некоторые того, что вам нужно предпринять, чтобы прочитать карту.

Для других карт все зависит от самой карты, например, у меня есть кард-ридер и пустые карты, и у меня есть некоторые пользовательские данные на некоторых из них, к которым только я знаю, как получить доступ, но все же у меня есть какой-то старый спутник и проездные, которые снова разные.

Вы можете получить некоторые идеи здесь:

Как прочитать PAN из Смарт-карта EMV от Java

и здесь можно найти много информации о смарт-картах в целом:

https://web.archive.org/web/20160329205518/http://wrankl.de/SCTables/SCTables.html

особенно общие вещи (которых есть некоторые)

person shawty    schedule 14.06.2012

Я работаю над приложением в Visual Studio 2015 для чтения смарт-карт. Что вы хотите сделать, так это подключить USB-устройства к вашему компьютеру, которые являются устройствами чтения смарт-карт. Затем повторите возврат для информации, которую вы ищете. Хотя у ридеров довольно много свойств, вот те, которые я решил использовать. Я надеюсь, что это даст вам начало в правильном направлении:

static List<USBDeviceInfo> GetUSBDevices()
    {
        List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

        ManagementObjectCollection collection;
        using (var searcher = new ManagementObjectSearcher(@"Select *      FROM Win32_PnPEntity where Description Like ""%Smart%card%"""))
            collection = searcher.Get();
        string Device_ID = "";

        foreach (var device in collection)
        {
            devices.Add(new USBDeviceInfo(
            (string)device.GetPropertyValue("DeviceID"),
            (string)device.GetPropertyValue("PNPDeviceID"),
             (string)device.GetPropertyValue("Name"),
            (string)device.GetPropertyValue("Description"),
            (string)device.GetPropertyValue("Status")));


            Device_ID = (string)device.GetPropertyValue("DeviceID");

        }

        collection.Dispose();
        return devices;
    }
person Bob Cooley56    schedule 17.02.2017