【发布时间】:2011-01-31 14:01:25
【问题描述】:
我应该如何开始使用 C# (.NET) 为智能卡编程? 一开始我只需要知道读卡器的名称是什么(例如 Omnikey) 并打印出来。
谢谢你的回答,Ales。
【问题讨论】:
我应该如何开始使用 C# (.NET) 为智能卡编程? 一开始我只需要知道读卡器的名称是什么(例如 Omnikey) 并打印出来。
谢谢你的回答,Ales。
【问题讨论】:
不久前,我不得不编写一些我认为将是一些简单易用的智能卡代码,让我告诉你,这不是在公园里散步。首先,事实证明,关于智能卡的好信息在网上很难找到。当我确实找到了几个网站时,有很多关于底层 Win32 API 调用和一大堆其他低级内容的讨论,这不是很容易阅读。
问题是它们被称为智能卡是有原因的。原因是您基本上是通过向嵌入式微处理器发送它可以理解和响应的命令来与它进行交互。这可能会变得有点复杂,因为许多制造商认为实现自己的命令是个好主意,所以很多事情都取决于您使用的卡类型。最重要的是,有些卡看起来像智能卡,但不是真正的智能卡,甚至不使用任何“标准”智能卡接口,因此您最终使用 Windows SmartCard API 只是为了启动您的阅读器,而智能卡读卡器的特殊 API 作为 .lib 在其网站的某个不起眼的角落提供,以供其余部分使用...
好吧,我最终确实让我的应用程序运行起来了,但就像我说的那样,这并不容易。无论如何,我犯了一个大错误,即认为这不会很难做到。
如果你真的想进入智能卡领域,我想你最好的选择是买一本关于这个主题的好书,但由于我也只是一个新手,所以我真的帮不了你。
至于网站,我能挖掘到的最有用的 C# 术语是 A Smartcard Framework for .Net。请注意,这与the one posted by michaelvdnest 不是同一篇文章,尽管作者是相同的。我链接到的文章描述了原生智能卡 API 的 C# 包装器,而 michaelvdnest 将 XML 添加到混合中,虽然我不知道具体是什么方式,因为我还没有阅读它。
所以开始剖析文章提供的代码,祝你好运。如果没记错的话,读者枚举的东西很容易找到。
【讨论】:
查看代码项目上的Smart Card Framework for .NET。它描述了一个用于 .NET 的 XML 框架,用于对智能卡应用程序进行编程。
【讨论】:
我知道已经很晚了.....
但是
您可以在这里获得一个非常易于使用且免费供个人使用的专业库:
https://www.smartcard-api.com/
这里还有一个社区(完全免费使用)智能卡库
https://www.nuget.org/packages/PCSC
近年来,如果您需要商业支持,我更倾向于使用 Nu-get 而非智能卡 API,但智能卡 API 库是最佳选择。
一旦你有了这些,你就需要开始了解 APDU 以及如何在卡和终端之间来回穿梭。
这确实是一个巨大的主题,我有代码可以读取标准芯片和引脚 EMV 卡上的所有常见元素,不幸的是它是为金融服务客户编写的,所以我不能给你,我可以不过,请解释您阅读卡片需要采取的一些措施。
对于其他卡,则取决于卡本身,例如,我这里有一个读卡器和空白卡,其中一些我有一些自定义数据,只有我知道如何访问,但我仍然有一些旧卫星卡和旅行卡又不同了。
你可以在这里得到一些想法:
How do I read the PAN from an EMV SmartCard from Java
这里有很多关于智能卡的一般信息:
https://web.archive.org/web/20160329205518/http://wrankl.de/SCTables/SCTables.html
尤其是通用的东西(其中有一些)
【讨论】:
我一直在使用 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;
}
【讨论】: