【问题标题】:How to read serial number of a Gemalto smart card?如何读取金雅拓智能卡的序列号?
【发布时间】:2013-07-24 04:36:51
【问题描述】:

我有智能卡和读卡器(金雅拓)。我想使用 C# 读取卡的序列号。我阅读了金雅拓支持网站上的文档/库,但没有对我有用的信息。

我希望有人对金雅拓有经验,可以帮我举一些例子!

非常感谢!

【问题讨论】:

    标签: c# smartcard smartcard-reader gemalto


    【解决方案1】:

    您必须向智能卡发送 APDU,询问卡产品生命周期数据,即(CPLC 数据)。
    某些特定类型的卡片具有卡片生产生命周期 (CPLC) 数据。例如,JCOP 卡在 GET DATA 或 GETCPLCDATA 的 0x9F7F 标记或 0x0101 标记处有这个。我相信这是一个全球平台特定的标签。查找您的卡支持的规格。对于金雅拓卡,我希望它会起作用。 我通过查询 CPLC 数据从我的 gemalto 卡中得到的数据是:

    对于 0x9F7F:

    IC Fabricator :2 Bytes
    IC Type : 2 Bytes
    Operating System ID : 2 Bytes
    Operating System release date : 2 Bytes
    Operating System release level : 2 Bytes
    IC Fabrication Date : 2 Bytes (Y DDD) date in that year
    IC Serial Number : 4 Bytes
    IC Batch Identifier : 2 Bytes
    IC Module Fabricator : 2 Bytes
    IC Module Packaging Date :  2 Bytes
    ICC Manufacturer : 2 Bytes
    IC Embedding Date :2 Bytes
    IC Pre-Personalizer : 2 Bytes
    IC Pre-Perso. Equipment Date : 2 Bytes
    IC Pre-Perso. Equipment ID : 4 Bytes
    IC Personalizer : 4 Bytes
    IC Personalization Date : 2 Bytes
    IC Perso. Equipment ID : 4 Bytes
    

    对于 0x0101:

    Card serial number: 8 bytes  
    Reserved bytes: 3 bytes 0
    Flow identification: 1 byte  
    Reserved bytes: 4 bytes 
    

    抱歉,我无法提供确切的字节数,您的情况可能会有所不同。只需检查您的卡支持的标签。最好参考全球平台文档和 ISO 7816 标准 (http://www.ttfn.net/techno/smartcards/iso7816_4.html)。 我希望这就是你要找的。​​p>

    【讨论】:

      【解决方案2】:

      以下是通过PowerShell获取它的方法:

      注意:这专门针对正在被 IDPrime MD 产品线取代的金雅拓 IDPrime .NET 卡。有关更多信息,请参阅本文末尾。

      使用金雅拓 IDPrime .NET SDK

      Add-Type -Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.2.180\Libraries\On Card\Framework Libraries\v2.1.213.9175\SmartCard.dll"
      Add-Type -Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.2.180\bin\SmartCard_stub.dll"
      Add-Type -Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.2.180\bin\SmartCard.Runtime.dll"
      $Reader = New-Object SmartCard.Transport.PCSC.SelectDialog
      $Reader.ShowDialog() | Out-Null
      
      $SmartCard = New-Object SmartCard.Accessor.CardAccessor($Reader.SelectedReader)
      
      $SmartCardSN = [System.BitConverter]::ToString($SmartCard.GetSerialNumber())
      
      Write-Host "Smartcard Serial Number: $SmartCardSN"
      
      $SmartCard.Dispose()
      $Reader.Dispose()
      

      使用金雅拓 IDPrime .NET PKCS #11 驱动程序

      如果你想使用 PKCS11 库,可以如下进行。但是,此路由带有 WARNING,因为它返回的是序列号的哈希值,而不是实际的序列号。根据金雅拓文档:

      .NET PKCS#11 库执行 CSN 的 MD5 哈希,该 CSN 由 微型驱动程序给出 16 字节的结果。由于C_GetTokenInfo 字符串只有 16 个字节,它只能以 ASCII 格式显示 16 个字符的哈希结果。这 16 个字符是哈希结果的 8 个 MSB(最左边的字节)。

      示例:

      1. .NET PKCS#11 库请求从 卡ID文件: 0x57 0x01 0x13 0x51 0x26 0xC7 0xD6 0x10 0x29 0x27 0xFF 0xFF
      2. .NET PKCS#11 对 CSN 执行 MD5 哈希,得到 16 字节的结果: 0x05 0xCB 0x00 0x3D 0x76 0xD3 0xE9 0x4F 0x74 0x13 0xD8 0x74 0x38 0x8C 0xBF 0xB4
      3. .NET PKCS#11 将散列转换为 ASCII 字符串。
      4. 最后它用 ASCII 字符串的前 16 个字符填充 TokenInfo 结构的 serialNumber 字段(16 个字节):“05CB003D76D3E94F”对应于哈希的 8 个 MSB。
      # www.pkcs11interop.net
      Add-Type -Path "C:\SomeFolder\Pkcs11Interop.4.0.0\lib\net45\Pkcs11Interop.dll"
      
      # Load Gemalto driver
      # 1 = AppType.SingleThreaded
      $pkcs11 = New-Object Net.Pkcs11Interop.HighLevelAPI.Pkcs11("C:\Program Files (x86)\Gemalto\DotNet PKCS11\gtop11dotnet64.dll",1)
      
      # 0 = SlotsType.WithTokenPresent
      $Slots = $pkcs11.GetSlotList(0)
      
      $CardReader = $Slots[0] # Usually first slot
      
      $CardReader.GetTokenInfo().SerialNumber
      
      $CardReader.CloseAllSessions()
      $pkcs11.Dispose()
      

      金雅拓卡类型

      以上示例基于即将停用的金雅拓 IDPrime .NET 卡。 End of Sale (EOS) announcement is here

      IDPrime .Net
      IDPrime .Net 生物
      
      关键日期:
      里程碑日期
      最后一次购买 (LTB) 2017 年 9 月 29 日
      终止销售 (EOS) 2017 年 9 月 30 日
      2018 年 9 月 30 日停产 (EOL)

      替换

      Per the EOS announcement PDF:

      产品 金雅拓的 IDPrime .NET 510/511 智能卡系列将被 IDPrime MD 83xIDPrime MD 84x 系列智能卡取代。

      对替换卡进行编程

      我已包含有关区分卡类型的信息,因为我有一个用于测试的金雅拓 IDPrime MD 830,但上述技术不起作用。事实上,使用上述技术,卡片甚至不会显示在读卡器中。

      【讨论】:

        【解决方案3】:

        如果您指的是卡上的序列号,您可以执行以下操作:

        您需要参考 Gemalto SDK 中的 Off card dll。 智能卡运行时.dll SmartCard_Stub.dll

        SmartCard.Transport.PCSC.SelectDialog dialog = new SmartCard.Transport.PCSC.SelectDialog();
        CardAccessor ca = new CardAccessor(dialog.SelectedReader);
        if(ca.Logon())
        {
        ca.GetSerialNumber();
        }
        

        如果您指的是证书上的序列号,那是一种完全不同的方法。

        【讨论】:

        • 如何测试我们在 gemalto .net 卡上的 apdu 工作正常?我们已经使用客户端服务器应用程序对其进行了测试,但如何检查它是否适用于旧系统?
        【解决方案4】:

        this post。您的卡上的内容可能略有不同(尤其是 CLA 字节)。

        基本上你需要选择卡文件系统的根目录(MF,a.k.a. 3F00),然后选择卡的 EFiccid (2FE2) 并读取内容。理论上很简单。

        每个步骤都有一个专用的 APDU 命令。如果 Gemalto 库允许您发送 APDU,那么您应该可以开始了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          • 2017-06-23
          • 1970-01-01
          相关资源
          最近更新 更多