首页 > 编程知识 正文

NFC技术基础篇,银行卡 nfc

时间:2023-05-06 05:01:37 阅读:223534 作者:3280

一. NFC卡基础单词了解

 sector扇区
 block块


二.采购卡片信息
把卡一直放后面读设备会发热

09(CPU卡)
 android.nfc.tech.IsoDep, android.nfc.tech.NfcA
10(CPU的7K加M1的1K)
 会读到android.nfc.tech.IsoDep, android.nfc.tech.NfcA和android.nfc.tech.IsoDep, android.nfc.tech.NfcA, android.nfc.tech.NfcA, android.nfc.tech.MifareClassic, android.nfc.tech.NdefFormatable,中任意一种。第二种其实包含第一种的两个情况的。说明第一种的是没读取全。这个等于是09的加23的所以NfcA是重复的。
23 (S70的4K加CPU的4K)
 android.nfc.tech.NfcA,android.nfc.tech.MifareClassic,android.nfc.tech.NdefFormatable,
 S70的23卡会被格式化为NDEF。被NDEF后就可恢复出厂设置。会被格式化为NDEF就不行的Cpu的09卡,暂时对cpu类型的没研究。m1的10卡,不会被格式化,恢复出厂虽然现实成功,但数据还在。


三.卡数据读取
卡使用的技术包括
mTechLists = new String[][] { new String[] { NfcF.class.getName() }, new String[] { NfcA.class.getName() }, new String[] { NfcB.class.getName() }, new String[] { NfcV.class.getName() }, new String[] { Ndef.class.getName() }, new String[] { NdefFormatable.class.getName() }, new String[] { IsoDep.class.getName() }, new String[] { MifareClassic.class.getName() }, new String[] { MifareUltralight.class.getName() } };
CPU卡对应识别的是IsoDep,m1卡对应的是NfcA。从记录0采购卡片信息中可以看出一种卡包含很多种呀。
NFC三重过滤机制。
(1)NDEF_DISCOVERED: 只过滤固定格式的NDEF数据。例如:纯文本、指定协议(http、ftp、smb等)的URI等;
(2)TECH_DISCOVERED: 当ACTION_NDEF_DISCOVERED指定的过滤机制无法匹配Tag时,就会使用这种过滤机制进行匹配,这种过滤机制并不是通过Tag中的数据格式进行匹配的,而是根据Tag支持的数据存储格式进行匹配,因此这种过滤机制的范围更广;
(3) TAG_DISCOVERED: 如果将NFC过滤机制看成if...else if...else语句的话,那么这种过滤机制就相当于else部分,当前面两种过滤机制都匹配失败后,系统就会利用这种过滤机制来处理,这种过滤机制用来处理未识别的Tag(数据格式不对,而且Tag支持的格式也不匹配)。
四.下载软件android-filechooser.apk即nfc写卡软件。
 发现23卡可被擦写格式化为NDEF卡,09和10不行提示有保护。应该是S70的那部分问题。也可通过代码的写操作变成NDFF卡。23卡转换为NDFF卡后所有扇区验证都失败了
五.使用擦写为出厂设置就会恢复初始了,所以不用怕测试操作导致卡不能用。(前提这个卡,可擦写。10好像擦了也没改变,可能是密码我改过吧)。
六.cpu的扇区是读取不出来的。或者其压根没有扇区概念
 有些扇区可能会验证失败原因是密码A或者B错误。 M1的S70卡4K字节, 共40个扇区,前32个扇区中,每个扇区4个数据块,每个数据块16个字节,后8个扇区中,每个扇区16个数据块,每个数据块16个字节;我的那张卡后8个扇区会验证失败 M1卡1k字节。共16个扇区,每个扇区4个数据块
七.数据块说明之MifareClassic卡通过Access Bits来控制keyA和keyB的读写权限
 扇区和数据块都是0开始算的。第一个扇区自然指0了。但扇区的块编号是即使扇区改变也一直递增的。获取mfc.sectorToBlock(SectorPos)//获取扇区第一个块编号加上读取块是第几个块就是读取块编号。
 0扇区的0块(Manufacturer Blcok)由厂商使用,存储了IC卡的生产产商代码,前4个字节(即8个数字)是卡号。第5个字节是校验位,后面的是生产商数据。
 其他扇区的第0块没存东西。第0块被这个使用,所以这个扇区特殊只有两个数据块。如下图,扇区的前三个块为Data Blocks(数据块),当然拥有16块的扇区数据库有15个,每个扇区的第4块(Sector Trailer(扇区尾部)控制块)包括密码A(不能读出,所以程序读出都是显示0000的)、密码B及相应扇区中的所有块的存储控制位(位于第6个字节到第9个字节)左边是低字节,则6、7、8、9字节为FF、07、80、69,这是默认的控制字,其中69是保留字节值并没有任何作用。1字节两个16进制,对应8位2进制。

  每个扇区4块,都有三个控制区名称如下。C10,,C20,C30后面的0代表对块0的控制,前面的1,2,3代表控制区编号

 块3控制块的控制位意思如图5.1,下图中例子说明不知道为什么不是001的而是100。后直接算一遍应该是001
例子
(1)根据下表5.1和5.3:  当C1x C2x C3x = 100时,即每个块的控制区编号都是100
(2)结合图5.2。所有C1开头的都是1,C2,C3开头的为0。_b表示取反。可得下面结果
 字节611110000
 字节7:11111111
 字节8:00000000
 字节9备用字节,随便填充如00000000

(3)然后对应的16进制为0xF0,0xFF,0x00,0x00
(4)因此此时的控制位为: (byte)0xF0, (byte)0xFF, (byte) 0x00,(byte)0x00
(5)所以根据你想要自定义对数据块和控制块数据是否可读可写。了解需求后根据图7.1和图7.3则定义好所有的C10,C20,C30,C11,C21等等等的二进制值。然后根据图7.2就得到对应二进制值了。然后转换为16进制就得到控制块的控制位的16进制值了。反之,通过控制块的控制位的16进制值得到对应二进制值,然后根据图5.2获取每个CXX的值,根据7.1和7.3图得到对应的权限

图7.1



图7.2


块0,1,2数据块的控制位意思

图7.3



八.M1卡通过测试结论:
 当知道密码情况下数据块可修改,控制块可修改,0扇区0块(存储id的地方)无法修改。格式化和恢复出厂也不会影响。卡买来密码是默认密码。手机可以模拟id。所以只用id判断是不够的。需要在扇区中存储id对应的加密后数据。与后台进行比较。我们平时使用时,需要把A和B密码改为我们自己的。还有我们买的卡第二控制区是FF078069(最后两字节无所谓)即密码A是无法被读取出来只能修改(不可读取情况下读出来的都是0),而密码b是可被读取和修改的,最好改为7F078869(最后两字节无所谓)。A和B都不能被读取而修改时都需要密码B。平时用authenticateSectorWithKeyA解密密码A就好。虽然如果b需要加个authenticateSectorWithKeyB就可以。
九.cardid,卡连不连接验不验证都可以读取到的。
 所以在1扇区的1块中存入。用id加密后的密文(每次加密结果都在变的)。到时与设备通过id转化的密文比较相同则id对应的科室签到成功。科室和id的关系需要存入后台。密文比较交给后台处理也可以
以上纯属个人笔记,图片和一些信息取自网上资料,如有问题请纠正!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。