M1卡 (Mifare 1K) 1K指的是容量大小,16個扇區(0-15扇區),每個扇區分4塊(0-3塊),每塊16個字節,16X4X16 = 1024byte=1kb。
每個扇區的塊3存儲的是KEY_A(6字節)+控制位(4字節)+KEY_B(6字節)。控制位決定密鑰A和密鑰B分別能做哪些操作,如讀寫012塊,修改密鑰等。具體規則百度一下有很多文章說明。
數據存儲在每個扇區的0、1、2塊。第0扇區的第0塊是廠商代碼,已經固化,不可更改。所以一般用於存儲的是0扇區1、2塊和1-15扇區的0-2塊。
指令流程 : 加載密鑰(load)–>認證(auth)->讀寫等操作(read/write/inc/dec)。
具體指令與讀卡器相關。
網上搜索M1相關內容時搜索到ACR122U讀卡器(A)並下載到API文檔(http://www.acs.com.hk/download-manual/933/API_ACR122U(CN)_2.02.pdf),根據其文檔操作某品牌讀卡器(B),加載密鑰失敗,直接認證成功,應該是使用了默認密鑰FFFFFFFFFF,所以可以進行后續讀寫等操作,但無法改密碼,因為改密碼后因為加載密鑰指令不正確會無法認證。
另一品牌讀卡器(C)所有指令都不對,聯系到廠商,拿到了相應的api文檔后,所有操作都可正常執行。
指令詳情可參考上面的文檔,這里說下 因與讀卡器相關而造成的坑。
加載認證密鑰:
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都不同,由廠商文檔提供。
使用的是java讀寫卡,用到javax.smartcardio包下的相關API。
讀寫卡的另一個坑,當檢測到卡的時候,需要等待0.5-1S左右,再去和卡交互。檢測到卡,立即認證讀寫可能會操作失敗。我的實踐是:在我的64位win7機器上,不等待,直接操作,沒問題;在另外2台(1台64位win7,一台64位win10)機器上,不等待,總是報PCSCException,等待200ms,有時報錯,等待1S基本不報錯。
---------------------
作者:堅持做筆記
來源:CSDN
原文:https://blog.csdn.net/u011562187/article/details/59640614
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!