2015-07-21 120 views
2

我想阅读德国保险健康卡(如K)的姓名,地址等基本数据。 我有一个scm sdi011读卡器,我使用c#。 我已经从卡/读卡器获得ATR字符串,但我不知道如何继续。 如果有人能告诉我现在该做什么,那该多好。如何从c#中的智能卡读取名称和地址等基本数据?

这里是我的代码:

WinSCard card = new WinSCard(); 
    try { 
     card.EstablishContext(); 
     card.ListReaders(); 
     string szReader = card.ReaderNames[1]; 
     card.Connect(szReader); 
     string ATRStr = card.AtrString; 
     ATRBox.Text = ATRStr; 
    } catch (WinSCardException exception) { 
     richTextBox1.Text = exception.WinSCardFunctionName + " Error 0x" + exception.Status.ToString("X08") + ": " + exception.Message; 
    } finally { 
     card.Disconnect(); 
    } 
+1

那你曾* *抽到了ATR让我觉得,你认为自己接近目标。不幸的是,这种情况并非如此。获取您感兴趣的一代eGK规范(除ISO 7816-4外),并检查数据存储位置(EF.Personendaten)。这是很多的工作,重要的细节不太可能在这里找到现成的。问题不在于* C#*,而在于具有特殊智能卡理念的命令序列。 – guidot

+0

我已经发现,我想要的数据存储在EF.PD(或EF.PSD)中 - 问题是我不知道如何读出这个商店。 –

+0

文献推荐是Rankl/Effing:Handbuch der Chipkarten和ISO 7816,第4部分,特别是关于SELECT,READ BINARY的章节。之后,欢迎您回答具体问题。 – guidot

回答

1

苏氨酸粗糙的顺序如下(我离开了延长长度和访问权限):

  • 选择适当的DF
  • 选择文件EF .PD
  • 发送一个的序列读二进制指令增加在P1/P2编码的偏移量

在以下方括号表示任选的部件。

的sendbuffer必须包含命令APDU,我。即CLA,INS,P1,P2,[LC,数据],[LE] 其最简单的,以指定LE = 0,从那时起卡发送尽可能多的,你有一个想法,通过该值来递增P1/P2 。

答案包含[数据] SW1/SW2,所以至少两个字节应该返回。如果你减少了,这可能表明你的命令是畸形的,并被winscard直接拒绝,而没有被发送到卡上。

+0

嗨再次,所以我现在有CLA = 0x00; INS = 0XB0; INS = 0x00; P1 = 0x00; P2 = 0x00; LC = 0x00; LE = 0x00; SendBuffer = CLA,INS,P1,P2,LC,LE;但我得到的唯一“数据”就是这个东西“103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0“我参考了ISO 7816-4 pdf,发现很多关于CLA和0x00似乎是最好的选择(”命令是连锁的最后一个或唯一命令“ )。 INS我拿B0作为ReadBinary。参数字节我设置0x00 - 是否错误? lc和le我也设置0x00 ....我的错误是什么? –

+0

该卡响应67 00 - >长度错误(由于ISO只使用十六进制,所以十进制基数非常不寻常)。这是正确的,因为指定LC = 0且没有数据是非法的,请参阅我的可选括号。 – guidot

+0

现在好了(当我做LC = 0x01)我得到6A 86 =不正确的参数P1-P2 ... P1 = 0xD0; P2 = 0×01;我设置了这个P1和P2,因为在gematik的egk规范中,我发现D0 01是EF.PD的文件标识符 - 但是现在出了什么问题? :-( –

相关问题