天天看點

讀寫M1卡小結

  1. M1卡 (Mifare 1K) 1K指的是容量大小,16個扇區(0-15扇區),每個扇區分4塊(0-3塊),每塊16個位元組,16X4X16 = 1024byte=1kb。
  2. 每個扇區的塊3存儲的是KEY_A(6位元組)+控制位(4位元組)+KEY_B(6位元組)。控制位決定密鑰A和密鑰B分别能做哪些操作,如讀寫012塊,修改密鑰等。具體規則百度一下有很多文章說明。
  3. 資料存儲在每個扇區的0、1、2塊。第0扇區的第0塊是廠商代碼,已經固化,不可更改。是以一般用于存儲的是0扇區1、2塊和1-15扇區的0-2塊。
  4. 指令流程 : 加載密鑰(load)–>認證(auth)->讀寫等操作(read/write/inc/dec)。
  5. 具體指令與讀卡器相關。

    網上搜尋M1相關内容時搜尋到ACR122U讀卡器(A)并下載下傳到API文檔(http://www.acs.com.hk/download-manual/933/API_ACR122U(CN)_2.02.pdf),根據其文檔操作某品牌讀卡器(B),加載密鑰失敗,直接認證成功,應該是使用了預設密鑰FFFFFFFFFF,是以可以進行後續讀寫等操作,但無法改密碼,因為改密碼後因為加載密鑰指令不正确會無法認證。

    另一品牌讀卡器(C)所有指令都不對,聯系到廠商,拿到了相應的api文檔後,所有操作都可正常執行。

  6. 指令詳情可參考上面的文檔,這裡說下 因與讀卡器相關而造成的坑。

    加載認證密鑰:

    FF 82 00 00 06 FF FF FF FF FF FF (A讀卡器)

    FF 82 00 61 06 FF FF FF FF FF FF (B讀卡器)

    FF 50 00 00 06 FF FF FF FF FF FF (C讀卡器)

    A是文檔來的,B是某程式得來的(不知道是不是與此讀卡器配套的程式,但确實是這個指令),C是廠商提供的。

    第2個位元組表示指令,各廠商不一樣,第4位元組表示密鑰加載到何處,各廠商又不一樣。第5位元組表示後面跟的密鑰長度為6位元組,後面6個位元組就是密鑰。

    認證和讀寫指令B讀卡器與A文檔中相同。C讀卡器則與AB都不同,由廠商文檔提供。

  7. 使用的是java讀寫卡,用到javax.smartcardio包下的相關API。
  8. 讀寫卡的另一個坑,當檢測到卡的時候,需要等待0.5-1S左右,再去和卡互動。檢測到卡,立即認證讀寫可能會操作失敗。我的實踐是:在我的64位win7機器上,不等待,直接操作,沒問題;在另外2台(1台64位win7,一台64位win10)機器上,不等待,總是報PCSCException,等待200ms,有時報錯,等待1S基本不報錯。