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
版权声明:本文为博主原创文章,转载请附上博文链接!