C# 智能卡编程

10

我该如何开始为智能卡编写C# (.NET)程序?

首先,我需要知道读卡器的名称(例如Omnikey),并将其输出。

谢谢您的回答,Ales。

4个回答

16

前一段时间我需要编写一些看似简单易懂的智能卡代码,但是让我告诉你,那可不是轻松愉快的事情。首先,网络上很难找到有关智能卡的好资料。即使我找到了几个网站,上面也充斥着对底层Win32 API调用和其他很多低级别的东西的讨论,这让人望而却步。

关键是它们之所以被称为“smart cards”是有原因的。那个原因是你基本上是通过发送它能理解并回应的命令与嵌入式微处理器进行交互。这可能会变得有点复杂,因为许多制造商认为实现自己的命令是一个好主意,因此很多东西取决于你使用的卡的类型。此外,有些卡看起来像智能卡,但实际上并不是真正的智能卡,甚至不使用任何“标准”的智能卡接口,因此你最终使用Windows SmartCard API来启动读卡器,并使用其提供的特殊API(以.lib文件形式出现在他们网站的某个角落)来完成剩下的操作...

嗯,我最终确实让我的应用程序工作了,但就像我说的那样,这并不容易。无论如何,我的一个大错误是认为这种编写不会很困难。

如果你真的想研究智能卡,我想最好的办法是找一本好书,但由于我自己也只是个新手,所以在这方面我真的不能帮你。

至于网站,就C#而言,我能够找到的最有用的东西是.Net的Smartcard Framework。请注意,这不是与michaelvdnest发布的文章相同的文章,尽管作者是相同的。我链接的文章描述了原生智能卡API的一个C#包装器,而michaelvdnest的文章将XML添加到其中,虽然我还没有读过该文章,不知道它具体是怎么做的。

因此,请开始分析提供的文章代码,并祝您好运。如果我没记错的话,读者枚举的内容很容易找到。


非常感谢您的长篇回答 :) 我的同事已经告诉我我还有很长的路要走...他也无法帮助我。现在我知道它是可以完成的,感谢提供链接,我已经找到并正在阅读和处理它。 - Thorusan86
@sql 你不是第一次使用Stackoverflow了。请提出一个新问题。 - dandan78
你说得没错,这确实不是一件轻松的事情。我们的其中一位开发人员之前已经根据参考文章实现了代码,因此读取卡片并没有给我带来问题,但我仍在努力想出如何进行身份验证以允许我读取来自欧洲数字式车速表卡的安全数据。阅读规范就像在泥浆中游泳一样困难。 - Steve Crane
最近接手了编写智能卡程序的“毒酒杯”,我想不起上次来上班感到如此沮丧了... - Fetchez la vache

3

我已经做过了,而且我还在继续工作。谢谢! :) - Thorusan86
这是同一个人的更新版本:http://www.codeproject.com/Articles/16653/A-Smart-Card-Framework-for-NET - VoteCoffee

3

我知道现在太晚了......

但是,您可以在这里获取一个非常易于使用且个人使用免费的专业库:

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

还有一个社区(完全免费)的智能卡库:

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

近年来,我更喜欢使用Nu-get而不是智能卡API,但是如果您需要商业支持,则智能卡API库是最佳选择。

一旦您拥有该库,您就需要开始了解APDU以及如何将其从卡片传输到终端。

这确实是一个庞大的主题,我有一个代码可以读取标准芯片和Pin EMV卡上的所有常见元素,但不幸的是它是为金融服务客户编写的,因此我不能提供给您,但我可以解释一些关于如何读取卡片的内容。

对于其他卡片,这取决于卡片本身。例如,我在这里有一个读卡器和空白卡片,并且我有一些自定义数据在其中一些卡上,只有我知道如何访问,但我还有一些旧的卫星和旅行卡片是不同的。

您可以在此处获取一些想法:

如何从Java读取EMV智能卡上的PAN

并且可以在此处找到有关智能卡的许多信息:

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

尤其是通用的东西(其中有一些)


0

我一直在使用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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接