2013-02-21 141 views
0

以下代碼起作用,並允許我獲取Mifare 1k卡的UID。不幸的是,它不適用於Desfire卡。Mifare DESFIRE EV1 GetCardUid

public byte[] GetUid() 
    { 
     byte[] uid = new byte[6]; 
     int rc = Communicate(new byte[]{0xff, 0xca, 0x00, 0x00, 0x04}, ref uid); 
     if (rc != 0) 
      throw new Exception("failure: " + rc); 

     int rc1, rc2; 
     if (uid.Length == 2) 
     { 
      rc1 = uid[0]; 
      rc2 = uid[1]; 
     } 
     else 
     { 
      rc1 = uid[4]; 
      rc2 = uid[5]; 
     } 

     if (rc1 != 0x90 || rc2 != 0x00) 
      throw new Exception("failure: " + rc1 + "/" + rc2); 

     byte[] result = new byte[4]; 
     Array.Copy(uid, result, 4); 
     return result; 
    } 

我看了一下以下資源

...,並試圖做這樣的:

 byte[] outb = new byte[15]; 
     int rc9 = Communicate(new byte[] { 0x60 }, ref outb); 

outb總是包含{0x67,0x00},而不是如預期的那樣{af 04 01 01 00 02 18 05}。

連接成功,SCardGetAttrib允許我獲取ATR。 Communicate方法適用於SCardTransmit。如果有幫助,我可以發佈代碼。

感謝任何指針!

編輯

感謝您的第一個答案!我按照建議更改了程序:

 byte[] outb = new byte[9]; 
     int rc5 = Communicate(new byte[]{0x90, 0x60, 0x00, 0x00, 0x00, 0x00}, ref outb); 

現在outb是{0x91,0x7E}。這似乎更好,0x91看起來像ISO 7816響應代碼,但不幸的是不是0x90,正如預期的那樣。 (我還查看了第二個鏈接中的DESFIRE_TRANSCEIVE宏,如果它接收到0xf2,則繼續閱讀)。我嘗試了谷歌搜索ISO 7816 APDU響應代碼,但沒有成功解碼錯誤代碼。

編輯2

我還發現了下面的註釋:

與OMNIKEY 5321我得到的DESFire ATR 3B8180018080 UID 04 52 2E AA 47 23 80 90 00 [從APDU FFCA000000所有其他APDU給917E未知 錯誤

這說明我的錯誤代碼,並給了我另一種暗示,FFCA000000看上去很小號類似於我的其他Mifare 1k弦。因此,對於FFCA000000,我得到一個9字節的響應,其中似乎包含UID。有趣的是,FFCA000000代碼也適用於1k卡,所以也許我的解決方案只是將最後的04更改爲00,並處理不同長度的響應。對?

編輯3

看來一分錢下降了... 0×04 = 4字節響應=太小了7字節UID =響應917E =緩衝區太小:-)

回答

1

嘗試您提供的第一個鏈接的「本地包裝」版本。您的接口需要ISO 7816-4樣式的APDU(因爲它返回ISO 7816-4狀態字,意思是錯誤的長度)。

3

此代碼似乎工作:

 int rc = Communicate(new byte[] { 0xff, 0xca, 0x00, 0x00, 0x00 }, ref uid); 
     if (rc != 0) 
      throw new Exception("failure: " + rc); 

     int rc1 = uid[uid.Length-2], rc2 = uid[uid.Length-1]; 

     if (rc1 != 0x90 || rc2 != 0x00) 
      throw new Exception("failure: " + rc1 + "/" + rc2); 

     byte[] result = new byte[uid.Length - 2]; 
     Array.Copy(uid, result, uid.Length - 2); 
     return result; 

有何評論?

+0

感謝您與我們分享代碼,很高興我幫助您朝着正確的方向發展。 – 2013-02-22 12:18:09

+0

測試過哪個硬件? – 2013-04-19 21:09:33

+0

Mifare DESfire EV1,Mifare Classic 1k和Mifare Classic 4k。 – 2013-04-20 06:49:44

2

Cla = ff命令是pcsc第3部分命令。 Ins = ca應該可以與pcsc 2.0x兼容的分辨率閱讀器一起工作

相關問題