如何读取金雅拓智能卡的序列号?

时间:2013-07-24 04:36:51

标签: c# smartcard smartcard-reader gemalto

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

我希望有人知道金雅拓帮我一些例子!

非常感谢!

4 个答案:

答案 0 :(得分:6)

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

对于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)。 我希望这就是你要找的东西。

答案 1 :(得分:2)

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

您需要在Gemalto SDK中引用Off卡dll。 SmartCard.Runtime.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();
}

如果您的意思是证书上的序列号,那么它就是一种完全不同的方法。

答案 2 :(得分:2)

以下是通过PowerShell

获取的方式
  

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

使用Gemalto 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()

使用Gemalto IDPrime .NET PKCS#11驱动程序

如果要使用PKCS11库,可以按如下方式完成。但是,此路由带有 WARNING ,因为它返回序列号的散列而不是实际的序列号。每个金雅拓文档:

  

.NET PKCS#11库执行由CS提供的CSN的MD5哈希   minidriver给出16字节的结果。由于C_GetTokenInfo字符串仅为16个字节,因此只能以ASCII格式显示16个字符的哈希结果。这16个字符是散列结果的8个MSB(最左边的字节)。

     

示例:

     
      
  1. .NET PKCS#11库请求来自的12字节卡序列号(CSN)   卡ID文件:   0x57 0x01 0x13 0x51 0x26 0xC7 0xD6 0x10 0x29 0x27 0xFF 0xFF
  2.   
  3. .NET PKCS#11在CSN上执行MD5哈希,得到16字节的结果:   0x05 0xCB 0x00 0x3D 0x76 0xD3 0xE9 0x4F 0x74 0x13 0xD8 0x74 0x38 0x8C 0xBF 0xB4
  4.   
  5. .NET PKCS#11将哈希转换为ASCII字符串。
  6.   
  7. 最后,它使用ASCII字符串的前16个字符填充TokenInfo结构的serialNumber字段(16字节):“05CB003D76D3E94F”对应于散列的8 MSB。
  8.   
# 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 Bio

Key Dates: 
Milestone                  Date
Last-Time-Buy (LTB)        September 29, 2017
End-of-Sale (EOS)          September 30, 2017
End-of-Life (EOL)          September 30, 2018

替换

Per the EOS announcement PDF

  

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

编程替换卡

我已经包含了有关区分卡类型的信息,因为我有一个Gemalto IDPrime MD 830用于测试,上述技术不起作用。实际上,使用上述技术,该卡甚至不会显示在阅读器中。

答案 3 :(得分:1)

this post。卡上的情况可能略有不同(特别是CLA字节)。

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

每个步骤都有一个专用的APDU命令。如果Gemalto库允许您发送APDU,那么您应该很高兴。