2013-04-12 47 views
3

我正在使用Java智能卡API進行訪問。 我有恩智浦Mifare desfire 4K,1K,超輕型智能卡與我&試圖找出它的類型在JAVA程序化。如何讓SAK識別使用JAVA的智能卡類型?

我參考恩智浦站點的文檔AN10833(http://www.nxp.com/documents/application_note/AN10833.pdf)。我有以下查詢相關:

  1. 如何獲得SAK使用JAVA?
  2. 什麼是APDU執行REQA命令?
+0

告訴我們您嘗試過的東西,我們可能會幫助您。 – mthmulders

+0

通過使用本機命令,我已經檢索到以下信息,1)cmd:90,60,00,00,00響應> 04 01 01 00 02 18 05 2)cmd:90,AF,00,00,00響應> 04 01 01 00 06 18 05 3)cmd:90,AF,00,00,00響應04 2C 32 F9 B8 23 80 8F D5 15 49 20 10 09.這裏UID- 04 2C 32 F9 B8 23 80批號 - 8F D5 15 49 20周10年09 UID [0]是恩智浦半導體。 但是我不能通過上面的命令來識別卡的類型,不管它是超輕型還是其他任何信息。 –

+0

您是否試圖按照[javax.smartcardio'軟件包摘要結尾處的步驟操作](http://docs.oracle.com/javase/6/docs/jre/api/security/smartcardio/spec/的javax/smartcardio /包summary.html)? – mthmulders

回答

4

找出卡的ATR和ATR包含卡類型的信息。在這裏,我上傳的圖片查看ATR ... 的結構欲瞭解更多信息Here the full PDF 看看頁面沒有6.

enter image description here

enter image description here

+1

非常好的anwer,vikky。唯一的評論是,對於非接觸式卡片,我的公司通常將此信息稱爲ATS(答覆選擇而不是回答重置)非接觸式卡片。 +1希望更多upvotes將遵循... –

+0

@owlstead謝謝...... :) – vikky

+0

我已經把櫻桃放在上面給你... –

1

編輯:道歉,這並不直接回答但目前的最佳答案是有潛在危害的。我試圖發現如何讓SAK自己會嘗試發佈更新。從ATS/ATR確定卡類型是司空見慣的,但是錯誤的。恩智浦建議使用SAK。

「由於不同的MIFARE芯片的ATS可定製,它是 肯定不可取依靠ATS區分IC 型」

編號:http://www.nxp.com/documents/application_note/AN10833.pdf

相反,請看這裏查看如何從SAK確定卡類型的詳細樹: http://www.nxp.com/documents/application_note/130830.pdf

另外,在p如果你可以放心,你將永遠在你的所有卡上獲得相同格式的ATR/ATS,這可能是一個可行的選擇。但不能保證。

我不知道世界上VCA是,但是從第一個文檔:

「今後,NXP建議使用‘虛擬卡架構(VCA)’ 爲PICC選擇和類型識別。如果安裝不是 取決於卡片 選擇和標識的ATQA,SAK和/或ATS的實際內容,這允許多個MIFARE 產品在相同的 時間內在單個設備中啓用激活。這種情況下,VCA允許高效和隱私友好型 選擇有針對性的MIFA RE產品。這是在 單獨的應用筆記。」

+0

後續跟進:我們從未能夠找到令人滿意的解決方案。由於ATS/ATR是可定製的,我們可以找到的最好的方法就是進行依賴於上下文的檢查。示例:調試程序將允許您選擇要嘗試的卡類型,並返回是否可以獲取連接。這意味着我們不能說錯誤的類型被嘗試過,我們只能說連接不可能被獲得。 –

1

我知道這是一個古老的博客,但我一直在這個同樣的問題,並希望分享我的發現。

在AN10833它明確指出, UID + SAK從執行選擇中返回。使用java智能卡io庫我可以執行如下選擇:

// Send pseudo APDU to retrieve the card serial number (UID) 
int cla = 0xFF; 
int ins = 0xCA; 
int p1 = 0x00; 
int p2 = 0x00; 
byte[] data = null; 
int dataOffset = 0x00; 
int dataLength = 0x00; 
int le = 0x00; 

CommandAPDU getDataApdu = new CommandAPDU(cla, ins, p1, p2, data, dataOffset, dataLength, le); 
ResponseAPDU r1 = channel.transmit(getDataApdu); 

但是,我只返回了UID。我發現在PC/SC API上改變P1 = 0x01的文檔會將響應更改爲歷史字節(這對我有用)。 (從部分3.2.2.1.3這裏:http://pcscworkgroup.com/Download/Specifications/pcsc3_v2.01.09.pdf

不幸的是,關閉的,現成的讀者我有機會獲得我找不到參數返回SAK。在另一個讀者的API文檔中,我發現如果p2 = 0x01,則返回ATQA + UID + SAK(這個讀者是支持性的,我不能共享文檔)。我相信如果你的讀者支持它(或者你的編碼水平足夠低來控制讀者本身),你可以得到/請求確切的SAK。否則,您可能需要使用ATS/ATR來確定卡的類型。

注意,在Java這裏是抓住ATS/ATR的代碼:

// wait 10 seconds for a card 
CardTerminal terminal = terminal.waitForCardPresent(10000); 

Card card = terminal.connect("*"); 
ATR atr = card.getATR(); 

從那裏,ATR可被處理爲vikky如上所述。

我會迴應我學的任何東西。

相關問題