【问题标题】:C# smartcards programmingC# 智能卡编程
【发布时间】:2011-01-31 14:01:25
【问题描述】:

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

谢谢你的回答,Ales。

【问题讨论】:

    标签: c# smartcard


    【解决方案1】:

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

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

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

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

    至于网站,我能挖掘到的最有用的 C# 术语是 A Smartcard Framework for .Net。请注意,这与the one posted by michaelvdnest 不是同一篇文章,尽管作者是相同的。我链接到的文章描述了原生智能卡 API 的 C# 包装器,而 michaelvdnest 将 XML 添加到混合中,虽然我不知道具体是什么方式,因为我还没有阅读它。

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

    【讨论】:

    • 非常感谢您这么长的回答 :) 我的同事已经告诉我,我还有很长的路要走……他也帮不了我。好吧,现在我知道它可以完成,感谢您的链接,我已经找到它,我现在正在阅读和处理它。
    • @sql 你对 Stackoverflow 并不陌生。问一个新问题。
    • 你不是在开玩笑,不是在公园里散步。我们的一位开发人员之前已根据参考文章实现了代码,因此读取卡片并没有给我带来问题,但我正在努力弄清楚如何进行身份验证以允许我从欧洲数字行驶记录卡读取安全数据。阅读规范有点像在泥泞中游泳。
    • 最近拿起了不得不为智能卡编程的毒酒杯,我不记得上次上班时如此沮丧...
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    但是

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

    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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多