DaDaDaDaDa

众所周知,刷卡需要读取卡号,而一般的ic卡,或者m1卡,用手机NFC或者读卡器都能读到8位16进制的uid
你可以直接使用这个8位的作为卡号,但是一般的操作是按67 45 23 01的顺序转换一下,然后转为10进制作为卡号
例如,读到的是41ef5664,然后两两翻转41 ef 56 64 -> 64 56 ef 41
最后转为10进制,也就是1683418945

DiDaDaDaDa

这时候,客户的需求来了,客户要求读取32位卡号,那这个32位卡号哪里来呢
众所周知,一般的ic卡,有16个扇区,每个扇区有4个块
而这个32位的uid,就在0扇区的0块上,出厂的时候就已经写进去了,而前8位就是我们之前读到的那个卡号
其他的包含厂商信息之类的
那么我们只需要读取0扇区0块的数据就可以了
大概就是这样

而每个扇区的最后一个块,前6个字节是A密钥,中间4个字节是访问控制,最后6个字节是密钥B
每个扇区可以分别控制,互不影响,以适用各种场景

DiDiDaDaDa

众所周知,一般读卡器,厂商会附带个开发包,demo啥的,然后一般的卡,密钥A密钥B都是FFFFFFFFFFFF
验证密钥,读卡,没得问题,可偏偏我手上有张卡,密钥不是默认的FFFFFFFFFFFF
用厂家给的demo,死活验证不对,用手机验证却没得问题
尝试了几次后,用手机写卡把密钥改成FFFFFFFFFFFF,成功读出,难顶

DiDiDiDaDa

如果就上面那个坑也就算了
因为卡可能有不同的密钥(我目前需要两个),所以一般的设想是,先验证默认的12个F,如果不行,那就换另一个
这时候,蛋疼的来了,只要第一次验证错了,第二次验证也是错的,即使你的密钥是对的
这也是我在尝试了多次以后才找到的
也就是说,每一轮的读卡,只能验证一次密钥,失败了,就得等下一轮密钥……
好吧,随便改改,编译,交差

DiDiDiDiDa

这个坑告诉我们,厂家的开发包,demo,可信,也不可信
毕竟,我都已经把他的jar都翻了好几遍了,依然没有找到问题
不过,管他呢,能用就行,要啥自行车