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

本文关键字:金雅拓 智能卡 序列号 读取 何读取 | 更新日期: 2023-09-27 18:24:30

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

我希望有人有经验的金雅拓帮助我一些例子!

非常感谢!

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

您必须向智能卡发送APDU,询问卡产品生命周期数据,即CPLC数据
某些特定类型的卡具有卡生产生命周期(CPLC)数据。例如,JCOP卡在GET DATA或GETPLCDATA0x9F7F标记或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)。我希望这就是你想要的。

以下是如何通过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()

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

如果您想使用PKCS11库,可以按如下方式进行。但是,此路由带有警告,因为它返回的是序列号的散列,而不是实际序列号。根据金雅拓文件:

.NET PKCS#11库执行由给出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()

金雅拓卡类型

以上示例基于Gemalto IDPrime.NET正在退役的卡。销售结束(EOS)公告在这里。

IDPrime.NetIDPrime.Net生物关键日期:里程碑日期上次购买(LTB)2017年9月29日销售结束(EOS)2017年9月30日寿命终止(EOL)2018年9月30日

更换

根据EOS公告PDF:

产品金雅拓的IDPrime.NET 510/511系列智能卡将被IDPrime MD 83xIDPrime MD84x

对更换卡进行编程

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

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

您需要参考金雅拓SDK中的Off-card dll。SmartCard.Runtime.dllSmartCard_Stub.dll

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

如果你指的是证书上的序列号,那就完全不同了。

请参阅本文。卡上的内容可能略有不同(尤其是CLA字节)。

基本上,您需要选择卡文件系统的根(MF,也称为3F00),然后选择卡的EFIcid(2FE2)并读取内容。理论上很简单。

对于每个步骤,都有一个专用的APDU命令。如果金雅拓库允许你发送APDU,你应该可以去。