我应该如何开始使用C#(.NET)编程智能卡? 首先我只需要知道,读卡器的名称是什么(例如Omnikey) 打印出来。
感谢答案,Ales。
答案 0 :(得分:14)
前段时间我不得不写一些我认为简单易用的智能卡代码,让我告诉你,它不是在公园散步。首先,事实证明,网上很难获得有关智能卡的良好信息。当我找到几个网站时,有很多关于底层Win32 API调用和一大堆其他低级内容的讨论,这不是很容易阅读。
事情是他们被称为智能卡是有原因的。这个原因是你基本上通过发送它理解和响应的命令与嵌入式微处理器进行交互。这可能会有点复杂,因为许多制造商认为实现自己的命令是个好主意,因此很多事情都取决于您使用的卡的类型。最重要的是,有些卡看起来像智能卡,但不是真正的智能卡,甚至不使用任何“标准”智能卡接口,因此您最终只能使用Windows SmartCard API来启动阅读器,智能卡读卡器的特殊API在其网站的某个不起眼的角落以.lib的形式提供给其他人...
好吧,我确实让我的应用程序最终正常工作,但就像我说的那样,这并不容易。无论如何,我认为做起来并不是很困难,这是一个很大的错误。
如果你真的想进入智能卡,我想你最好的选择是获得一本关于这个主题的好书,但由于我也只是一个新手,我真的无法帮助你。
至于网站,我能够挖掘的C#术语中最有用的是A Smartcard Framework for .Net。请注意,这与michaelvdnest发布的文章不同,尽管作者是相同的。我链接的文章描述了本地智能卡API的C#包装器,而michaelvdnest则将XML添加到组合中,虽然我不知道究竟是什么方式,因为我还没有阅读它。
所以开始解析文章提供的代码并祝你好运。如果内存为我服务,读者枚举的东西很容易找到。
答案 1 :(得分:3)
在代码项目上查看Smart Card Framework for .NET。它描述了一个用于.NET编程智能卡应用程序的XML框架。
答案 2 :(得分:2)
我知道这已经晚了.....
但
您可以在这里获得一个非常易于使用且免费供个人使用的专业图书馆:
http://www.smartcard-api.com/index.shtml
一旦你有了这个,你需要开始了解APDU以及如何在卡到终端之间来回穿梭。
它真的是一个很大的主题,我有一些代码可以读取标准芯片上的所有常见元素。不幸的是,针EMV卡是为金融服务客户编写的,所以我不能给你,但我可以解释一下你需要承担什么来读卡。
对于其他卡,然后是卡本身,例如,我有一个读卡器和空白卡,我有一些自定义数据,其中只有我知道如何访问,但我仍然有一些旧卫星和旅行卡再次不同。
你可以在这里得到一些想法:
How do I read the PAN from an EMV SmartCard from Java
这里有很多关于智能卡的信息:
http://www.wrankl.de/SCH/SCH.html
特别是通用的东西(其中有一些)
答案 3 :(得分: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;
}