10

我应该如何开始在 C# (.NET) 中为智能卡编程?一开始我只需要知道读卡器(例如 Omnikey)的名称是什么,然后打印出来。

谢谢你的回答,艾尔斯。

4

4 回答 4

16

不久前,我不得不编写一些我认为将是一些简单易用的智能卡代码,让我告诉你,这不是在公园里散步。首先,事实证明,关于智能卡的好信息在网上很难找到。当我确实找到了几个网站时,有很多关于底层 Win32 API 调用和一大堆其他低级内容的讨论,这并不容易阅读。

问题是它们被称为智能卡是有原因的。原因是您基本上是通过向嵌入式微处理器发送它可以理解和响应的命令来与它进行交互。这可能会变得有点复杂,因为许多制造商认为实现自己的命令是个好主意,所以很多事情都取决于您使用的卡类型。最重要的是,有些卡看起来像智能卡,但不是真正的智能卡,甚至不使用任何“标准”智能卡接口,因此您最终使用 Windows SmartCard API 只是为了启动您的阅读器,而智能卡读卡器的特殊 API 作为 .lib 在其网站的某个不起眼的角落提供,以供其余部分使用...

好吧,我最终确实让我的应用程序正常工作,但就像我说的那样,这并不容易。无论如何,我犯了一个大错误,认为这不会很难做到。

如果你真的想进入智能卡,我想你最好的选择是买一本关于这个主题的好书,但由于我也只是一个新手,我真的无法帮助你。

至于网站,我能够挖掘出的 C# 术语中最有用的东西是A Smartcard Framework for .Net。请注意,这与michaelvdnest 发布的文章不同,尽管作者是相同的。我链接到的文章描述了本机智能卡 API 的 C# 包装器,而 michaelvdnest 将 XML 添加到混合中,尽管我不知道确切的方式,因为我还没有阅读它。

所以开始剖析文章提供的代码,祝你好运。如果没记错的话,读者枚举的东西很容易找到。

于 2011-01-31T14:51:53.280 回答
3

在 Code Project 上查看Smart Card Framework for .NET 。它描述了一个用于 .NET 的 XML 框架,用于对智能卡应用程序进行编程。

于 2011-01-31T14:49:13.820 回答
3

我知道已经晚了......

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

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

这里还有一个社区(完全免费使用)智能卡库

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

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

一旦你有了这些,你就需要开始了解 APDU 以及如何将它们从卡到终端来回穿梭。

这确实是一个巨大的主题,我有代码可以读取标准芯片和引脚 EMV 卡上的所有常见元素,不幸的是它是为金融服务客户编写的,所以我不能给你,但我可以解释一些读卡所需的内容。

对于其他卡,则取决于卡本身,例如,我在这里有一个读卡器和空白卡,其中一些有一些自定义数据,只有我知道如何访问,但我仍然有一些旧卫星和再次与众不同的旅行卡。

你可以在这里得到一些想法:

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

这里有很多关于智能卡的信息:

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

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

于 2012-06-14T21:32:22.673 回答
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;
    }
于 2017-02-17T16:56:45.357 回答