精华内容
下载资源
问答
  • ic卡数据修改

    2020-05-13 02:01:43
    ic卡数据修改,专业工具,普通勿下载.
  • IC卡数据修改V1.9.rar

    2021-06-15 09:52:50
    知道密码的情况下,修改卡内数据修改密码、修改控制位
  • IC/M1读写软件,适用于ACR122U读写器,可以在所有Windows 32位和64位系统 运行,可以读写修改卡内数据,更改密码、控制位,随意更改UID0块卡号 简单易操作,该软件是最新版V1.52
  • IC卡数据分析工具.7z

    2020-01-03 17:53:14
    IC卡数据分析软件,分析扇区数据内容,可一键修改。I
  • 浅谈IC卡数据分析

    万次阅读 多人点赞 2020-01-20 10:35:36
    文章目录1.简单介绍2. IC卡详解3.M1卡详解4.常用读写设备介绍5....简称M1,高频最常见的卡,每张卡独一无无二UID 号,可存储修改数据(学生卡,饭卡,公交卡,门禁卡)----国内大部分卡都是此卡 Mif...

    1.简单介绍

    • Mifare S50
      简称M1,高频最常见的卡,每张卡独一无无二UID 号,可存储修改数据(学生卡,饭卡,公交卡,门禁卡)----国内大部分卡都是此卡

    • Mifare UltraLight
      简称M0,高频低成本卡,出厂固化UID,可存储修改数据(地铁卡,公交卡)—谁碰谁死

    • Mifare UID(Chinese magic card)
      简称UID 卡,高频M1 卡的变异版本,可修改UID,国外叫做中国魔术卡,可以用来完整克隆M1 S50 的数据 ----某宝上有售,用来做空白卡,复制体!!

    CUID、FUID、SUID ------各种神奇的空白卡

    EM4XX
    简称ID 卡,低频常用固化ID 卡,出厂固化ID,只能读不能写(低成本门禁卡,小区门禁卡,停车场门禁卡)

    T5577
    简称可修改ID 卡,低频可用来克隆ID 卡,出厂为空卡,内有扇区也可存数据,个别扇区可设置密码。----可以理解为ID空白卡 复制体

    HID Prox II
    简称HID,低频美国常用的低频卡,可擦写,不与其他卡通用 ----厚卡,常见于签到卡

    CPU卡
    这个好像没有统一标准,里面是个FPGA,然后用的软核,里面自定义加密程序,还有有的声称是双CPU双位加密,充值用接触式,使用用非接触式,这个具体咋实现的就不清楚了-------很多省会城市的公交卡 、地铁卡用的是这种 ,还是谁碰谁死

    2. IC卡详解

    IC卡包括了ID卡,M1卡、CPU卡;ID卡指的是低频率的卡,读取的频率是不一样的。M1卡通常指的是恩智浦的S50芯片卡; CPU卡比ID卡和M1卡容量多、具有自动运算功能、还有安全性强的卡。

    • 1、ID卡
        全称为身份识别卡(Identification Card),是一种不可写入的感应卡,含固定的编号.卡号在封卡前写入后不可再更改,绝对确保卡号的唯一性和安全性.ID卡在弱电系统中一般作为门禁或停车场系统的使用者身份识别,因ID卡无密钥安全认证机制,且不能写卡,现在行业内的基本共识是ID卡不适合做成一卡通,也不合适做消费系统。
    • 2、 IC卡又称集成电路卡。
        它是在大小和普通信用卡相同的塑料卡片上嵌置一个或多个集成电路构成的。集成电路芯片可以是存储器或向处理器。带有存储器的IC卡又称为记忆卡或存储卡,带有微处理器的IC卡又称为智能卡或智慧卡。记忆卡可以存储大量信息;智能卡则不仅具有记忆能力,而且还具有处理信息的功能。IC卡可以十分方便地存汽车费、电话费、地铁乘车费、食堂就餐费、公路付费以及购物旅游、贸易服务等。
    • 3、 M1卡
        是指菲利浦下属子公司恩智浦出品的芯片缩写,目前都有国产芯片与其兼容,属于非接触式IC卡。M1卡,优点是可读可写的多功能卡,缺点是:价格稍贵,感应距离短,适合非定额消费系统、停车场系统、门禁考勤系统等。
    • 4、CPU卡
        CPU卡芯片通俗地讲就是指芯片内含有一个微处理器,它的功能相当于一台微型计算机。人们经常使用的集成电路卡(IC卡)上的金属片就是CPU卡芯片。CPU卡可适用于金融、保险、交警、政府行业等多个领域,具有用户空间大、读取速度快、支持一卡多用等特点,并已经通过中国人民银行和国家商秘委的认证。CPU卡从外型上来说和普通IC卡,射频卡并无差异,但是性能上有巨大提升,安全性和普通IC卡比,提高很多,通常CPU卡内含有随机数发生器,硬件DES,3DES加密算法等,配合操作系统即片上OS,也称COS,可以达到金融级别的安全等级。

    3.M1卡详解

    M1卡分为16个扇区,每个扇区4块(块0~3),共64块。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。
    其他各扇区的块0、块1、块2为 数据块 ,用于存贮数据;块3为 控制块 ,存放密码A、存取控制、密码B,其结构如下:

    在这里插入图片描述

    4.常用读写设备介绍

    此处不配图了

    • 最流行的读卡器:ACR122
      使用最多的读卡器,很流行,大抵是因为网络上流传了非常强大的GUI改卡读卡复制卡软件吧!某宝价格一百多,只能读取IC卡,不能读ID卡。
      易用性:★★★★

    • 旗舰级读卡器:Proxmark3
      国外的开源硬件,由FPGA驱动。性能十分强大,集嗅探、读取、克隆于一体,IC卡和ID卡通杀,可以插电脑可以接电源,当然其价格也是十分的感人。
      易用性:★★★

    • 最便宜的读卡器:PN532
      PN532由NXP出品,是一款高度集成的载波的13.56MHz传输模块,基于80C51内核有40KROM、1KRAM。某宝价格为几十元,非常便宜。只能用来读取IC卡,不能读取ID卡和CPU卡。
      易用性:★★

    • 全加密侦测神器:变色龙
      变色龙是一款辅助解密设备,与常规的复制机不同的是,常规的复制机是在卡片上解密,变色龙是在刷卡机上侦测密码,变色龙本身没有写卡的能力,只能将侦测到的密码给122或者pm3等有解密功能的复制机使用。其优点如下:
      1.变色龙侦测卡可破解Proxmark破解不开的国产全加密卡
      2.可同时侦测多扇区密码!
      3.可破解ACR122,Proxmark3,Icopy3等设备长时间破解不开的卡

    • ID、IC复制系列:iCopy3、100CD、29CD、16CD、06CD等
      此类设备支持ID卡和IC卡读卡和写卡,但并不能对数据进行编辑。

    5.滚码技术

    随着时间的推移,科技也在不断的进步,众多公司在时间的与现实的推动下不断的提高与完善自家技术,从最开始的明码系统到暗码系统,再从暗码系统演变到滚码系统,每一次技术的更新与升级都提升了卡片安全性。
    但俗话说:“魔高一尺,道高一丈”,技术的升级与破解一直是一个永恒的话题,技术的升级淘汰掉了更多的低端卡匠,但无疑同时增加的破解的难度。下面给大家简单分享一些滚动码的一些技术。

    1. 滚动码技术是如何出现的?

    最开始各大公司的卡片内数据都是以明码存放,例如楼层,户号,车位号,手机号,电梯到期时间等,由于卡内的到期时间是明码,用户直接可以修改,后来厂家发现这种漏洞以后,将卡内的这些信息加密处理,但在大神的面前,加密方法也被破解了,再此以后厂家发明了滚动码技术,判断是否为滚动码梯控其实很简单,某些大厂家的梯控都有自己的特征,直接就能看出来,如KD,HY,YH等,不知名的小厂梯控系统通过对比同一张卡两次刷卡的记录,也可以判断出来。

    2. 常见的滚动方式

    常见的滚动方式有校验从小数到大数,每次刷卡加一,或者从大数到小数每次减少,这种滚动方式常在次数卡上使用,还有公式滚动法,读取卡内的数据与校验,经过读头单片机计算以后,写入新的数据与校验,不同厂家的公式算法不一样。有些厂家的滚动还会以刷卡时间和公式进行滚动,但大同小异。

    3. 滚动码的破解方法

    滚动码技术的出现破解方法目前有如下几种

      1. 完整的破解了电梯的整套发卡梯控,找到算法,这种可以完美的对电梯卡进行延期等操作,只针对早期算法比较简单的滚动码,仅有软件计算,没有单片机计算的系统,目前新系统的算法不仅仅是软件计算还有发卡器内的单片机计算。
      1. 漏洞改法,通过更改控制位或者修改卡内某些地方的数据来压制卡内数据的滚动,这是利用了早期某些厂家的读头不会校验计算后的数据是否写入成功的漏洞。
      1. 初始码数据还原法,这种方法也属于漏洞改法的一种,利用了有些梯控厂家控制检测系统当识别到从未滚动过的卡(就是物业刚办的新卡)数据不会校验上次的逻辑漏洞,让卡内数据每次都是初始数据来对电梯读头进行欺骗,这时候的梯控读头已经修复检验写卡是否成功的漏洞,所以我们要让梯控读头完成一次完整的交互过程,完成以后我们在将卡内数据改回去即可,已经有厂家做出了这种还原卡,通过ariduino+pn532做离线写卡器实现。我们团队称这种卡为“处女卡”。
      1. 发卡器发卡,对于一些贼牛逼的厂家的算法无法破解,同时又采用由软件计算和发卡器内单片机双重计算的方式,针对这样的情况,我们使用同厂家同型号同版本的发卡器,通过修改发卡器发卡规则使得规则与物业的发卡规则相同来发卡,但是破解发卡规则是一个很大的工程,同时梯控厂家也不会向个人单独销售配套发卡器,所以这种方法只掌握在少数人的手中。
        以上就是目前滚动码技术的基本简述

    4.操作步骤

    我买的PM5设备,这里我只说IC卡
    1.把卡放到设备上
    2.点击读取
    3.读取成功导出dump文件(是一个二进制文件,网上有夏天和锤子软件可以读取)

    我写了python脚本可以去读二进制和写二进制,可以结合我们的 BCompare.exe,进行比较

    import struct
    import os
    
    #读取dump文件
    def readBin(filepath):
        binfile = open(filepath, 'rb') #打开二进制文件
        size = os.path.getsize(filepath) #获得文件大小
        line =0
        strBin = []
        for i in range(size):
            data = binfile.read(16) #每次输出一个字节
            line = line+1
            if data == b'':
                return strBin
            strBin.append(data)
            print(line,data)
        binfile.close()
    
    
    def writeBin(path,strBin):
        with open(path, 'wb')as fp:
            for x in strBin:
                fp.write(x)
    
    #写二进制
    if __name__ == '__main__': 
        readfilepath="./42.dump"
        writefilepath="./hexBin.dump" 
        strList = readBin(readfilepath)
        writeBin(writefilepath,strList)
        
    
    

    4.我们开始分析数据

    5.IC卡日期格式

    目前网上关于IC的数据分分析软件,主要集中是夏天和锤子软件。
    软件卖的挺贵的,各种算法也是不公开的。
    加了他们作者QQ要一下算法,居然要卖我十万!!!!。
    愤怒之下,我尝试自己去解析了几种常见日期算法,供大家来学习,剩余几种我还没破译出来

    序号 名称 十六进制 十进制 备注
    1.康拓系统时间 四位日期 4位1 C79F 2099.12.31 转2进制,1100 011 ,1100, 11111->99,12,31
    2.立林日期 4位2 E3FC 2099.12.31 未破解
    3 卡拉德日期 6位3 03A9E7 2099.12.31 ????
    4 明码日期6位 991231 2099.12.31 年.日.月
    5 明码日期倒6位 311299 2099.12.31 日.月.年
    6.富士通 暗码倒六位 1F0C63 2099.12.31 1F-0C-63转10进制31-12-99
    7 暗码6位1 630C1F 2099.12.31 63-0C-1F转10进制99-12-31
    8 暗码6位2 833C1F 2099.12.31 833-C-1F转10进制2099-12-31
    9 暗码6位3 833CF8 2099.12.31 833-C-F8/8
    10 明码正8位 20991231 2099.12.31 2099-12-31
    11 明码倒8位 31129920 2099.12.31 31-12-9920
    12 暗码8位1 14630C1F 2099.12.31 14-63-0C-1F转10进制20-99-12-31
    13 暗码8位2 08330C1F 2099.12.31 0833-0C-1F转十进制2099-12-31
    14 暗码倒8位1 1F0C6314 2099.12.31 1F-0C-63-14转10进制31-12-99-20
    15 暗码倒8位2 1F0C3308 2099.12.31 1F-0C-3308->倒序1F-0C-0833转十进制31-12-2099
    16 暗码倒8位3 33080C1F 2099.12.31 3308-0C-1F->倒序0833-0C-1F转十进制2099-12-31

    6.常见校验码

    异或
    异或取反
    字节和
    CRC-4/ITU
    CRC-5/EPC
    CRC-5/ITU
    CRC-5/USB
    CRC-6/ITU

    自行百度吧~

    7.楼层号表示

    一般是用二进制,举例
    FF 代表1~8层
    F 代表1~4层

    如果从负3层开始呢
    F 代表-3~1层
    FF 代表 -3~5层
    数据有可能被反码/逆序 等

    展开全文
  • IC卡时间修改

    2019-03-15 13:29:45
    IC卡数据修改系统时间、延期、系统时间读取、分析,系统识别
  • IC卡读卡器WEB读写IC卡数据IC卡WEB读数据IC卡网页自动读数据IC卡网页写数据 采用友我科技IC卡读卡器web插件可以对普通IC卡进行读和写操作,根据实际业务需求,可以手动点击读写和在web网页内自动读写. IC卡WEB读数据 ...


    采用友我科技IC卡读卡器web插件可以对普通IC卡进行读和写操作,根据实际业务需求,可以手动点击读写和在web网页内自动读写.

    IC卡WEB读数据

    在web网页内读IC卡数据的API有如下:
    1.M1卡读块,支持将读取的数据进行DES或者3DES加或者解密后送回

    M1ReadBlock(blockIndex, FormatID)
    

    如果DesDir=0则直接读块,如果DesDir=1(YW-607)或者DesDir=2(YW-607),同时指定DES的密钥,则将数据加解密后返回
    参数:blockIndex,块号,绝对地址,从0开始

    FormatID,格式,0:16进制字符串返回,1:普通字符串返回。
    2.M1卡读扇区,支持将读取的数据进行DES或者3DES加或者解密后送回

    M1ReadSector(sectorindex, FormatID)
    

    如果DesDir=0则直接读扇区,如果DesDir=1(YW-607)或者DesDir=2(YW-607),同时指定DES的密钥,则将数据加解密后返回
    参数:blockIndex,块号,绝对地址,从0开始

    FormatID,格式,0:16进制字符串返回,1:普通字符串返回。

    读块API和读扇区API都可以读出卡内数据, 对于1K字节的M1卡, 一个扇区包含4个数据块.

    现以读块数据为例:

    function ReadBlock()
    {
    	var BlockID;
    	var Key;
    	
    	BlockID = 4; //块号
    	Key ="FFFFFFFFFFFF";//卡的密钥,此处可以使用明文密钥,也可以使用下载的密钥
    	rfidreader.KeyMode=0;
    	rfidreader.KeyStringMode=0;
    	rfidreader.KeyString=Key;
    	rfidreader.Repeat=0;//只读一次
    	rfidreader.M1ReadBlock(BlockID, 0);//formatid=0为16进制返回数据
    }
    

    读卡器在回调中返回数据:

    //友我科技读卡器web插件回调函数
    rfidreader.onResult(function(resultdata)
    {
    	switch(resultdata.FunctionID)
        {
    		case 5:
    		
    		if(resultdata.Result>0)
    		{
    		CarNo = resultdata.CardNo;//卡号
            BlockData = resultdata.strData;	//块数据	
    		}
    		else
    		{
    			Alert("读失败");
    		}
    		break;
    
        }
    }
    );
    

    读一次数据就结束了,其实是很简单的.

    IC卡网页自动读数据

    对于自动读数据,与单词读数据的API接口是一样的, 不同的是我们通过友我科技IC卡读卡器web插件的属性repeat来控制, 当repeat=0表明单次读取, 当repeat=1表明是自动连续读取, 当读取到接过了,通过回调函数返回数据, 如果没有读到数据或者错误,则不返回任何数据.

    function ReadBlock()
    {
    	var BlockID;
    	var Key;
    	
    	BlockID = 4; //块号
    	Key ="FFFFFFFFFFFF";//卡的密钥,此处可以使用明文密钥,也可以使用下载的密钥
    	rfidreader.KeyMode=0;
    	rfidreader.KeyStringMode=0;
    	rfidreader.KeyString=Key;
    	rfidreader.Repeat=1;//此处修改成1,则表明自动连续读取
    	rfidreader.M1ReadBlock(BlockID, 0);//formatid=0为16进制返回数据
    }
    

    IC卡网页写数据

    IC卡web页面写数据通过如下api接口实现:
    1.M1卡写块,支持DES或者3DES加密后写块

    M1WriteBlock(blockindex,blockdata,FormatID)
    

    如果DesDir=0则直接将数据写块,如果DesDir=1(YW-607)或者DesDir=2(YW-607),同时指定DES的密钥,则将数据加解密后写块
    参数:blockIndex,块号,绝对地址,从0开始

    blockdata:要写入的字符串,由于M1卡的每块为16字节,故blockdata最终转换的16进制不够16字节长度,后面将补0x00,如果超过16字节,将去掉多余的字节。

    FormatID,格式,0:16进制字符串返回,1:普通字符串返回。

    2.M1卡写扇区,支持DES或者3DES加密后写扇区

    M1WriteSector(blockindex,blockdata,FormatID)
    

    如果DesDir=0则直接将数据写扇区,如果DesDir=1(YW-607)或者DesDir=2(YW-607),同时指定DES的密钥,则将数据加解密后写扇区
    参数:blockIndex,块号,绝对地址,从0开始

    blockdata:要写入的字符串,由于M1卡的扇区有4块和16块,可用字节为48字节和240字节

    故blockdata最终转换的16进制不够字节长度,后面将补0x00,如果超过字节长度,将去掉多余的字节。

    FormatID,格式,0:16进制字符串返回,1:普通字符串返回

    写数据的结果也是通过回调函数返回.
    以写数据块为例:

    function WriteBlock()
    {
    	var BlockID;
    	var Key;
    	var Data;
    	
    	BlockID = 4;  //块号
    	Key ="FFFFFFFFFFFF";//密钥
    	Data ="11223344556677889900AABBCCDDEEFF";//数据,16字节16进制数字
    	rfidreader.KeyMode=0;
    	rfidreader.KeyStringMode=0;
    	rfidreader.KeyString=Key;
    	rfidreader.Repeat=0;
    	rfidreader.M1WriteBlock(BlockID, Data,0);	
    }
    

    当写完成或者写失败后, 系统在回调函数中返回结果:

    rfidreader.onResult(function(resultdata)
    {
    	switch(resultdata.FunctionID)
        {
    
    		case 5:
    		document.getElementById("CardNo").value = resultdata.CardNo;
    		if(resultdata.Result>0)
    		{
    
    		case 6:
    		if(resultdata.Result>0)
    		{
    			CardNo=resultdata.CardNo;//成功写入卡的卡号
    			alert("写入成功");
    		}
    		else
    		{
    			alert("写入失败,错误:")
    		}
    		break;
        }
    }
    );
    

    链接: IC卡读卡器web开发指南.

    展开全文
  • IC卡操作软件(DUMP数据修改) V1.0 免费绿色版.rar
  • 修改IC卡全部扇区的软件.需要COM口。很简单很好用.
  • 修改之前软件读取的数据是dff70bb7(为小写)(即“DF F7 0B B7”,3扇区0块中以及14扇区2块中均有该数据),现将IC卡1这两个区块中的“DF F7 0B B7”修改IC卡2对应这两的区块的数据“DF FD 2E DE”,读取的数据并...
  • STM32+MFRC522完成IC卡号读取、密码修改数据读写

    千次阅读 多人点赞 2021-05-20 14:36:48
    使用MFRC522模块完成对IC卡卡号读取、卡类型区分、IC卡扇区密码修改、扇区数据读写等功能;底层采用SPI模拟时序,可以很方便的移植到其他设备,完成项目开发。 现在很多嵌入式方向的毕业设计经常使用到该模块,比如:...

    一、环境介绍

    MCU:  STM32F103ZET6

    开发软件: Keil5

    非接触式读写卡模块: MFRC522

    完整工程源码下载: https://download.csdn.net/download/xiaolong1126626497/18905806

    二、功能介绍

    使用MFRC522模块完成对IC卡卡号读取、卡类型区分、IC卡扇区密码修改、扇区数据读写等功能;底层采用SPI模拟时序,可以很方便的移植到其他设备,完成项目开发。  现在很多嵌入式方向的毕业设计经常使用到该模块,比如: 校园一卡通设计、水卡充值消费设计、公交卡充值消费设计等。

    三、MFR522介绍

    MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。

    MF RC522 利用了先进的调制和解调概念,完全集成了在13.56MHz 下所有类型的被动非接触式通信方式和协议。支持 ISO14443A 的多层应用。其内部发送器部分可驱动读写器天线与ISO 14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理ISO14443A 兼容的应答器信号。数字部分处理ISO14443A 帧和错误检测(奇偶 &CRC)。此外,它还支持快速CRYPTO1 加密算法,用于验证MIFARE 系列产品。MFRC522 支持MIFARE?更高速的非接触式通信,双向数据传输速率高达424kbit/s。

    作为13.56MHz 高集成度读写卡系列芯片家族的新成员,MF RC522 与MF RC500和 MF RC530 有不少相似之处,同时也具备诸多特点和差异。它与主机间的通信采用连线较少的串行通信,且可根据不同的用户需求,选取SPI、I2C 或串行UART(类似RS232)模式之一,有利于减少连线,缩小PCB 板体积,降低成本。

    四、IC卡介绍

    非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分。是世界上最近几年发展起来的一项新技术,它成功的将射频识别技术和IC卡技术结合起来,结束了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。卡片在一定距离范围(通常为5—10cm)靠近读写器表面,通过无线电波的传递来完成数据的读写操作。

    射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。

    非接触性IC卡与读卡器之间通过无线电波来完成读写操作。二者之间的通讯频率为13.56MHZ。非接触性IC卡本身是无源卡,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与本身的L/C产生一个瞬间能量来供给芯片工作。另一部分则是指令和数据信号,指挥芯片完成数据的读取、修改、储存等,并返回信号给读写器,完成一次读写操作。读写器则一般由单片机,专用智能模块和天线组成,并配有与PC的通讯接口,打印口,I/O口等,以便应用于不同的领域。

    M1卡详细指标

    M1卡是指M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号。

    M1(S50)卡详细规格:

    1. 芯片类型:PhilipsMifare1ICS50
    2. 存储容量:8Kbit,16个分区,每分区两组密码;
    3. 工作频率:13.56?MHz;
    4. 通讯速率:106KBoud;
    5. 读写距离:2.5~10cm;
    6. 读写时间:1~2ms;
    7. 工作温度:-20℃~55℃;
    8. 擦写寿命:>100,000次;
    9. 数据保存:>10年;
    10. 外形尺寸:ISO标准卡85.6x54x0.82;
    11. 封装材料:PVC、PET、PETG、0.13mm铜线;

    Mifare S50和Mifare S70又常被称为Mifare Standard、Mifare Classic、MF1,是遵守ISO14443A标准的卡片中应用最为广、影响力最大的的一员。而Mifare S70的容量是S50的4倍,S50的容量是1K字节,S70的容量为4K字节。

    读写器对卡片的操作时序和操作命令,二者完全一致。    Mifare S50和Mifare S70的每张卡片都有一个4字节的全球唯一序列号,卡上数据保存期为10年,可改写10万次,读无限次。一般的应用中,不用考虑卡片是否会被读坏写坏的问题,

    当然暴力硬损坏除外。 Mifare S50和Mifare S70的区别主要有两个方面。一是读写器对卡片发出请求命令,二者应答返回的卡类型(ATQA)字节不同。Mifare S50的卡类型(ATQA)是0004H,Mifare S70的卡类型(ATQA)是0002H。另一个区别就是二者的容量和内存结构不同。

    M1卡分为16个扇区,每个扇区由4块(0、1、2、3)组成。实际操作时,将16个扇区分为64个块,按绝对地址编号为0-63。

    结构如下:

     

    1. 第0个扇区用于存放厂商代码,意见固话,不可更改。
    2. 每个扇区的块0、块1、块2为数据块,可以用于存储数据。数据块可以进行读写操作。
    3. 每个扇区的块3为控制块,包括了密码A、存储控制、密码B。具体结构如下:

      4. 每个扇区的密码和控制位都是独立的,可以根据实际需求设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据和控制块)存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有一个相应的三个控制位。定义如下:

     Mifare 1 S50 白卡读写时一般步骤: 寻卡-->下载块密码--> 读写块数据。控制块也是一样。

     

         数据块的访问权限设置表格:(根据自己需要的权限,完成上图字节6、7、8的填充即可)

       控制块的读写权限设置:(包含了对密码A、控制权限、密码的读写权限)

     

     

     

               7  6  5  4  3  2  1  0

    字节6 1  1  1  1  1  1  1  1

    字节7 0  0  0  0  1  1  1  1

    字节8 0  0  0  0  0  0  0  0

    字节9

    设置的控制权限如下:0xFF 0x0F 0x00 0x00

    代表数据块的权限: 验证密码A或者密码B都可以对数据块进行读写操作或者加值键值操作。

    2. 代表控制块的权限

    (1) 验证A密码之后可以写A/B密码,不能读密码。

                         可以读控制字节(4个),无法写控制字节

                          可以读写B密码       

    (2) 验证B密码之后,可以读写A/B密码,也可读控制字节,但无法写控制字节。   

     

    五、核心代码

    5.1  rc522.c

    #include "sys.h"
    #include "RFID_RC522.h"
    #include "delay.h"
    #include "string.h"
    #include "usart.h"
    
    /*
    函数功能:移植接口--SPI时序读写一个字节
    函数参数:data:要写入的数据
    返 回 值:读到的数据
    */
    u8 RC522_SPI_ReadWriteOneByte(u8 tx_data)
    {			  	 
    	u8 rx_data=0;				 
      u8 i;
      for(i=0;i<8;i++)
    	{
    		RC522_SCLK=0;  
    		if(tx_data&0x80){RC522_OUTPUT=1;}
    		else {RC522_OUTPUT=0;}
    		tx_data<<=1;	
    		RC522_SCLK=1;
    		rx_data<<=1;
    		if(RC522_INPUT)rx_data|=0x01;
    	}
    	return rx_data; 
    }
    
    
    /*
    函数功能:初始化RC522的IO口	 
    */
    void RC522_IO_Init(void)
    {
    	RCC->APB2ENR|=1<<2;     //PA时钟使能 
    	RCC->APB2ENR|=1<<7;     //PF时钟使能
    	
    	//PA5  时钟 RC522_SCLK
    	//PA6  输入 RC522_INPUT
    	//PA7  输出 RC522_OUTPUT 
    	GPIOA->CRL&=0x000FFFFF;
    	GPIOA->CRL|=0x38300000;
    	GPIOA->ODR|=0x3<<5;
    	
    	//RC522_RST <----->PF1--复位脚
    	//RC522_SDA <----->PF0--片选脚
    	GPIOF->CRL&=0xFFFFFF00;
    	GPIOF->CRL|=0x00000033;
    	GPIOF->ODR|=0x3<<0;
    }	
    
    
    /*
    功能描述:选卡读取卡存储器容量
    输入参数:serNum 传入卡序列号
    返 回 值:成功返回卡容量
    */
    u8 RC522_MFRC522_SelectTag(u8 *serNum) //读取卡存储器容量
    {     
    	u8 i;     
    	u8 status;     
    	u8 size;     
    	u8 recvBits;     
    	u8 buffer[9];
    	     
    	buffer[0]=PICC_ANTICOLL1;	  //防撞码1     
    	buffer[1]=0x70;
    	buffer[6]=0x00;						     
    	for(i=0;i<4;i++)					
    	{
    		buffer[i+2]=*(serNum+i);	//buffer[2]-buffer[5]为卡序列号
    		buffer[6]^=*(serNum+i);	  //卡校验码
    	}
    	
    	RC522_CalulateCRC(buffer,7,&buffer[7]);	//buffer[7]-buffer[8]为RCR校验码
    	RC522_ClearBitMask(Status2Reg,0x08);
    	status=RC522_PcdComMF522(PCD_TRANSCEIVE,buffer,9,buffer,&recvBits);
    	
    	if((status==MI_OK)&&(recvBits==0x18))    
    		size=buffer[0];     
    	else    
    		size=0;
    	
    	return size; 
    }
    
    
    /*
    延时函数,纳秒级
    */
    void RC522_Delay(u32 ns)
    {
      u32 i;
      for(i=0;i<ns;i++)
      {
        __nop();
        __nop();
        __nop();
      }
    }
    
    
    /*
    函数功能:RC522芯片初始化
    */
    void RC522_Init(void)
    {
      RC522_IO_Init();	//RC522初始化
      RC522_PcdReset();  			//复位RC522 
      RC522_PcdAntennaOff();	//关闭天线
      DelayMs(2);  		  //延时2毫秒
      RC522_PcdAntennaOn();		//开启天线
      M500PcdConfigISOType('A'); //设置RC632的工作方式
    }
    
    
    /*
    函数功能:复位RC522
    */
    void RC522_Reset(void)
    {
      RC522_PcdReset();				//复位RC522
      RC522_PcdAntennaOff();	//关闭天线
      DelayMs(2);  		  //延时2毫秒
      RC522_PcdAntennaOn();		//开启天线  	
    }     
    
    
    /*
    功    能: 寻卡
    参数说明: req_code[IN]:寻卡方式
                    0x52   = 寻感应区内所有符合14443A标准的卡
                    0x26   = 寻未进入休眠状态的卡
              			pTagType[OUT]:卡片类型代码
                    0x4400 = Mifare_UltraLight
                    0x0400 = Mifare_One(S50)
                    0x0200 = Mifare_One(S70)
                    0x0800 = Mifare_Pro(X)
                    0x4403 = Mifare_DESFire
    返 回 值: 成功返回MI_OK
    */
    char RC522_PcdRequest(u8 req_code,u8 *pTagType)
    {
    	char status;  
    	u8 unLen;
    	u8 ucComMF522Buf[MAXRLEN];  	   // MAXRLEN  18
    
    	RC522_ClearBitMask(Status2Reg,0x08);	//清RC522寄存器位,/接收数据命令
    	RC522_WriteRawRC(BitFramingReg,0x07); //写RC632寄存器
    	RC522_SetBitMask(TxControlReg,0x03);  //置RC522寄存器位
     
    	ucComMF522Buf[0]=req_code; 	    //寻卡方式
    	
    	status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); //通过RC522和ISO14443卡通讯
    	
    	if((status==MI_OK)&&(unLen==0x10))
    	{    
    		*pTagType=ucComMF522Buf[0];
    		*(pTagType+1)=ucComMF522Buf[1];
    	}
    	else
    	{
    	  status = MI_ERR;
    	}  
    	return status;
    }
    
    
    /*
    功    能: 防冲撞
    参数说明: pSnr[OUT]:卡片序列号,4字节
    返    回: 成功返回MI_OK
    */
    char RC522_PcdAnticoll(u8 *pSnr)
    {
        char status;
        u8 i,snr_check=0;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; 
        
        RC522_ClearBitMask(Status2Reg,0x08);  //清RC522寄存器位 
        RC522_WriteRawRC(BitFramingReg,0x00); //写
        RC522_ClearBitMask(CollReg,0x80);     //清
     
        ucComMF522Buf[0]=PICC_ANTICOLL1;   //PICC_ANTICOLL1 = 0x93
        ucComMF522Buf[1]=0x20;
    	
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); //0x0c,通过RC522和ISO14443卡通讯
    											 //PCD_TRANSCEIVE =发送并接收数据
    											 //2:写入卡里的数据字节长度
    											 //ucComMF522Buf:存放数据的地址
    											 //unLen:从卡里读出的数据长度
        if(status==MI_OK)
        {
        	 for(i=0;i<4;i++)
    			 {   
    					 *(pSnr+i)=ucComMF522Buf[i];  //把读到的卡号赋值给pSnr
    					 snr_check^=ucComMF522Buf[i];
    			 }
    			 if(snr_check!=ucComMF522Buf[i])
    			 {
    					status = MI_ERR;
    			 }
        }   
        RC522_SetBitMask(CollReg,0x80);
        return status;
    }
    
    
    /*
    功    能:选定卡片
    参数说明:pSnr[IN]:卡片序列号,4字节
    返    回:成功返回MI_OK
    */
    char RC522_PcdSelect(u8 *pSnr)
    {
        char status;
        u8 i;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; 
        
        ucComMF522Buf[0]=PICC_ANTICOLL1;
        ucComMF522Buf[1]=0x70;
        ucComMF522Buf[6]=0;
    	
        for(i=0;i<4;i++)
        {
        	ucComMF522Buf[i+2]=*(pSnr+i);
        	ucComMF522Buf[6]^=*(pSnr+i);
        }
    		
        RC522_CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); //用MF522计算CRC16函数,校验数据
        RC522_ClearBitMask(Status2Reg,0x08);	                //清RC522寄存器位
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
        if((status==MI_OK)&&(unLen==0x18))status=MI_OK;
        else status=MI_ERR;
    		
        return status;
    }
    
    
    /*
    功    能:验证卡片密码
    参数说明:auth_mode[IN]: 密码验证模式
                     0x60 = 验证A密钥
                     0x61 = 验证B密钥 
              addr[IN]:块地址
              pKey[IN]:扇区密码
              pSnr[IN]:卡片序列号,4字节
    返    回:成功返回MI_OK
    */               
    char RC522_PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr)
    {
        char status;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN];  //MAXRLEN  18(数组的大小)
    	  
    	  //验证模式+块地址+扇区密码+卡序列号   
        ucComMF522Buf[0]=auth_mode;		
        ucComMF522Buf[1]=addr;				
        memcpy(&ucComMF522Buf[2],pKey,6); //拷贝,复制
        memcpy(&ucComMF522Buf[8],pSnr,4); 
    	 
        status=RC522_PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
        if((status!= MI_OK)||(!(RC522_ReadRawRC(Status2Reg)&0x08)))status = MI_ERR;
        return status;
    }
    
    
    /*
    功    能:读取M1卡一块数据
    参数说明: 
    					addr:块地址
              p   :读出的块数据,16字节
    返    回:成功返回MI_OK
    */ 
    char RC522_PcdRead(u8 addr,u8 *p)
    {
        char status;
        u8 unLen;
        u8 i,ucComMF522Buf[MAXRLEN]; //18
    
        ucComMF522Buf[0]=PICC_READ;
        ucComMF522Buf[1]=addr;
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);//通过RC522和ISO14443卡通讯
        if((status==MI_OK&&(unLen==0x90)))
        {
            for(i=0;i<16;i++)
    				{
    						*(p +i)=ucComMF522Buf[i];
    				}
        }
        else
        {   
    			status=MI_ERR;
    		}
        return status;
    }
    
    
    /*
    功    能:写数据到M1卡指定块
    参数说明:addr:块地址
              p   :向块写入的数据,16字节
    返    回:成功返回MI_OK
    */                  
    char RC522_PcdWrite(u8 addr,u8 *p)
    {
        char status;
        u8 unLen;
        u8 i,ucComMF522Buf[MAXRLEN]; 
        
        ucComMF522Buf[0]=PICC_WRITE;// 0xA0 //写块
        ucComMF522Buf[1]=addr;      //块地址
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
     
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
    
        if((status!= MI_OK)||(unLen != 4)||((ucComMF522Buf[0]&0x0F)!=0x0A))
        {
    				status = MI_ERR;
    		}
    		
        if(status==MI_OK)
        {
            for(i=0;i<16;i++)//向FIFO写16Byte数据 
            {    
            	ucComMF522Buf[i]=*(p +i);   
            }
            RC522_CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
            status = RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
            if((status != MI_OK)||(unLen != 4)||((ucComMF522Buf[0]&0x0F)!=0x0A))
            {   
    					status = MI_ERR;   
    				}
        }
        return status;
    }
    
    
    /*
    功    能:命令卡片进入休眠状态
    返    回:成功返回MI_OK
    */
    char RC522_PcdHalt(void)
    {
        u8 status;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; //MAXRLEN==18
    	  status=status;
        ucComMF522Buf[0]=PICC_HALT;
        ucComMF522Buf[1]=0;
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
        return MI_OK;
    }
    
    
    /*
    功    能:用MF522计算CRC16函数
    参    数:
    				*pIn :要读数CRC的数据
    				len:-数据长度
    				*pOut:计算的CRC结果
    */
    void RC522_CalulateCRC(u8 *pIn ,u8 len,u8 *pOut )
    {
        u8 i,n;
        RC522_ClearBitMask(DivIrqReg,0x04);  //CRCIrq = 0  
        RC522_WriteRawRC(CommandReg,PCD_IDLE);
        RC522_SetBitMask(FIFOLevelReg,0x80); //清FIFO指针
        
    	  //向FIFO中写入数据  
    		for(i=0;i<len;i++)
        {  
    			RC522_WriteRawRC(FIFODataReg,*(pIn +i));  //开始RCR计算
    		}
    		
    		RC522_WriteRawRC(CommandReg,PCD_CALCCRC);   //等待CRC计算完成 
    		i=0xFF;
        do 
        {
            n=RC522_ReadRawRC(DivIrqReg);
            i--;
        }
        while((i!=0)&&!(n&0x04));//CRCIrq = 1
    	  
    		//读取CRC计算结果 
    		pOut[0]=RC522_ReadRawRC(CRCResultRegL);
        pOut[1]=RC522_ReadRawRC(CRCResultRegM);
    }
    
    
    /*
    功    能:复位RC522
    返    回:成功返回MI_OK
    */
    char RC522_PcdReset(void)
    {
    	  RC522_RST=1;   //PF1写1
        RC522_Delay(10);
    	  RC522_RST=0;   //PF1清0
        RC522_Delay(10);
    	  RC522_RST=1;	 //PF1写1
        RC522_Delay(10);
        RC522_WriteRawRC(CommandReg,PCD_RESETPHASE);  //写RC632寄存器,复位
    	  RC522_WriteRawRC(CommandReg,PCD_RESETPHASE);	//写RC632寄存器,复位
        RC522_Delay(10);
        
        RC522_WriteRawRC(ModeReg,0x3D);             //和Mifare卡通讯,CRC初始值0x6363
        RC522_WriteRawRC(TReloadRegL,30);           //写RC632寄存器   
        RC522_WriteRawRC(TReloadRegH,0);
        RC522_WriteRawRC(TModeReg,0x8D);
        RC522_WriteRawRC(TPrescalerReg,0x3E);
    	
    	  RC522_WriteRawRC(TxAutoReg,0x40);//必须要
        return MI_OK;
    }
    
    
    /*
    函数功能:设置RC632的工作方式 
    */
    char M500PcdConfigISOType(u8 type)
    {
       if(type=='A')                        //ISO14443_A
       { 
    		 RC522_ClearBitMask(Status2Reg,0x08);     //清RC522寄存器位
    		 RC522_WriteRawRC(ModeReg,0x3D);          //3F//CRC初始值0x6363
    		 RC522_WriteRawRC(RxSelReg,0x86);         //84
    		 RC522_WriteRawRC(RFCfgReg,0x7F);         //4F  //调整卡的感应距离//RxGain = 48dB调节卡感应距离  
    		 RC522_WriteRawRC(TReloadRegL,30);        //tmoLength);// TReloadVal = 'h6a =tmoLength(dec) 
    	   RC522_WriteRawRC(TReloadRegH,0);
    		 RC522_WriteRawRC(TModeReg,0x8D);
    	   RC522_WriteRawRC(TPrescalerReg,0x3E);
    	   RC522_Delay(1000);
         RC522_PcdAntennaOn();		//开启天线 
       }
       else return 1;       //失败,返回1
       return MI_OK;				//成功返回0
    }
    
    
    /*
    功    能:读RC632寄存器
    参数说明:Address[IN]:寄存器地址
    返    回:读出的值
    */
    u8 RC522_ReadRawRC(u8 Address)
    {
        u8 ucAddr;
        u8 ucResult=0;		
    		RC522_CS=0;						//片选选中RC522
        ucAddr=((Address<<1)&0x7E)|0x80;
    		RC522_SPI_ReadWriteOneByte(ucAddr);		  //发送命令
    		ucResult=RC522_SPI_ReadWriteOneByte(0); //读取RC522返回的数据
    		RC522_CS=1;						   //释放片选线(PF0)
    		return ucResult;         //返回读到的数据
    }
    
    
    /*
    功    能:写RC632寄存器
    参数说明:Address[IN]:寄存器地址
              value[IN] :写入的值
    */
    void RC522_WriteRawRC(u8 Address,u8 value)
    {  
      u8 ucAddr;
    	RC522_CS=0; //PF0写 0 (SDA)(SPI1片选线,低电平有效)
      ucAddr=((Address<<1)&0x7E); 
    	RC522_SPI_ReadWriteOneByte(ucAddr); //SPI1发送一个字节
    	RC522_SPI_ReadWriteOneByte(value);  //SPI1发送一个字节
    	RC522_CS=1;										      //PF1写1(SDA)(SPI1片选线)
    }
    
    
    /*
    功    能:置RC522寄存器位
    参数说明:reg[IN]:寄存器地址
              mask[IN]:置位值
    */
    void RC522_SetBitMask(u8 reg,u8 mask)  
    {
        char tmp=0x0;
        tmp=RC522_ReadRawRC(reg);					//读RC632寄存器
        RC522_WriteRawRC(reg,tmp|mask);   //写RC632寄存器
    }
    
    
    /*
    功    能:清RC522寄存器位
    参数说明:reg[IN]:寄存器地址
             mask[IN]:清位值
    */
    void RC522_ClearBitMask(u8 reg,u8 mask)  
    {
        char tmp=0x0;
        tmp=RC522_ReadRawRC(reg);        //读RC632寄存器
        RC522_WriteRawRC(reg,tmp&~mask); // clear bit mask
    } 
    
    
    /*
    功    能:通过RC522和ISO14443卡通讯
    参数说明:Command[IN]:RC522命令字
              pIn [IN]:通过RC522发送到卡片的数据
              InLenByte[IN]:发送数据的字节长度
              pOut [OUT]:接收到的卡片返回数据
              *pOutLenBit[OUT]:返回数据的位长度
    */
    char RC522_PcdComMF522(u8 Command,u8 *pIn,u8 InLenByte,u8 *pOut,u8 *pOutLenBit)
    {
        char status=MI_ERR;
        u8 irqEn=0x00;
        u8 waitFor=0x00;
        u8 lastBits;
        u8 n;
        u16 i;
    	
        switch(Command)
        {
    			case PCD_AUTHENT:    //验证密钥
    					 irqEn=0x12;
    					 waitFor=0x10;
    					 break;
    			case PCD_TRANSCEIVE: //发送并接收数据
    					 irqEn=0x77;
    					 waitFor=0x30;
    					 break;
    			default:
    					 break;
        }
        RC522_WriteRawRC(ComIEnReg,irqEn|0x80);	
        RC522_ClearBitMask(ComIrqReg,0x80);			//清所有中断位
        RC522_WriteRawRC(CommandReg,PCD_IDLE);	
        RC522_SetBitMask(FIFOLevelReg,0x80);	 	//清FIFO缓存
        
        for(i=0;i<InLenByte;i++)
        {   
    				RC522_WriteRawRC(FIFODataReg,pIn[i]);
    		}
    		
    		RC522_WriteRawRC(CommandReg,Command);	 
    		if(Command==PCD_TRANSCEIVE)
    		{  
    			RC522_SetBitMask(BitFramingReg,0x80);	 //开始传送
    		}
        
    		//有问题,下面的循环
        //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
    		  i=2000;
    			do 
    			{
    				n=RC522_ReadRawRC(ComIrqReg);
    				i--;
    			}
    			while((i!=0)&&!(n&0x01)&&!(n&waitFor));
    				
    			RC522_ClearBitMask(BitFramingReg,0x80);
    			if(i!=0)
    			{    
            if(!(RC522_ReadRawRC(ErrorReg)&0x1B))
            {
                status=MI_OK;
                if(n&irqEn&0x01)
                {
    							status=MI_NOTAGERR;
    						}
                if(Command==PCD_TRANSCEIVE)
                {
                   	n=RC522_ReadRawRC(FIFOLevelReg);
                  	lastBits=RC522_ReadRawRC(ControlReg)&0x07;
                    if(lastBits)
                    {
    									*pOutLenBit=(n-1)*8+lastBits;
    								}
                    else
                    {   
    									*pOutLenBit=n*8;   
    								}
    								
                    if(n==0)n=1;
                    if(n>MAXRLEN)n=MAXRLEN;
                    for(i=0; i<n; i++)
                    {   
    									pOut[i]=RC522_ReadRawRC(FIFODataReg);    
    								}
                }
            }
            else
            {   
    					status=MI_ERR;   
    				}
        }
        RC522_SetBitMask(ControlReg,0x80);// stop timer now
        RC522_WriteRawRC(CommandReg,PCD_IDLE); 
        return status;
    }
    
    
    /*
    函数功能:开启天线  
    参    数:每次启动或关闭天险发射之间应至少有1ms的间隔
    */
    void RC522_PcdAntennaOn(void)
    {
        u8 i;
        i=RC522_ReadRawRC(TxControlReg);
        if(!(i&0x03))
        {
            RC522_SetBitMask(TxControlReg,0x03);
        }
    }
    
    
    /*
    函数功能:关闭天线  
    参    数:每次启动或关闭天险发射之间应至少有1ms的间隔
    */
    void RC522_PcdAntennaOff(void)
    {
    	RC522_ClearBitMask(TxControlReg,0x03); //清RC522寄存器位
    }
    
    

    5.2 rc522.h

    #ifndef RFID_RC522_H
    #define RFID_RC522_H
    #include "sys.h"
    
    /*
    RC522射频模块外部的接口:    
    *1--SDA <----->PF0--片选脚
    *2--SCK <----->PA5--时钟线
    *3--MOSI<----->PA7--输出
    *4--MISO<----->PA6--输入
    *5--悬空
    *6--GND <----->GND
    *7--RST <----->PF1--复位脚
    *8--VCC <----->VCC
    */
    #define RC522_OUTPUT PAout(7)
    #define RC522_INPUT PAin(6)
    #define RC522_SCLK PAout(5)
    #define RC522_CS PFout(0)
    #define RC522_RST PFout(1)
    
    
    //MF522命令字
    #define PCD_IDLE              0x00               //取消当前命令
    #define PCD_AUTHENT           0x0E               //验证密钥
    #define PCD_RECEIVE           0x08               //接收数据
    #define PCD_TRANSMIT          0x04               //发送数据
    #define PCD_TRANSCEIVE        0x0C               //发送并接收数据
    #define PCD_RESETPHASE        0x0F               //复位
    #define PCD_CALCCRC           0x03               //CRC计算
    
    
    //Mifare_One卡片命令字
    #define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态,返回的是卡的类型
    #define PICC_REQALL           0x52               //寻天线区内全部卡,返回的是卡的类型
    #define PICC_ANTICOLL1        0x93               //防冲撞
    #define PICC_ANTICOLL2        0x95               //防冲撞
    #define PICC_AUTHENT1A        0x60               //验证A密钥
    #define PICC_AUTHENT1B        0x61               //验证B密钥   命令认证代码
    #define PICC_READ             0x30               //读块
    #define PICC_WRITE            0xA0               //写块
    #define PICC_DECREMENT        0xC0               //扣款
    #define PICC_INCREMENT        0xC1               //充值
    #define PICC_RESTORE          0xC2               //调块数据到缓冲区
    #define PICC_TRANSFER         0xB0               //保存缓冲区中数据
    #define PICC_HALT             0x50               //休眠
    
    //MF522 FIFO长度定义
    #define DEF_FIFO_LENGTH       64                 //FIFO size=64byte
    #define MAXRLEN  18
    
    
    //MF522寄存器定义
    // PAGE 0
    #define     RFU00                 0x00    
    #define     CommandReg            0x01    
    #define     ComIEnReg             0x02    
    #define     DivlEnReg             0x03    
    #define     ComIrqReg             0x04    
    #define     DivIrqReg             0x05
    #define     ErrorReg              0x06    
    #define     Status1Reg            0x07    
    #define     Status2Reg            0x08    
    #define     FIFODataReg           0x09
    #define     FIFOLevelReg          0x0A
    #define     WaterLevelReg         0x0B
    #define     ControlReg            0x0C
    #define     BitFramingReg         0x0D
    #define     CollReg               0x0E
    #define     RFU0F                 0x0F
    // PAGE 1     
    #define     RFU10                 0x10
    #define     ModeReg               0x11
    #define     TxModeReg             0x12
    #define     RxModeReg             0x13
    #define     TxControlReg          0x14
    #define     TxAutoReg             0x15
    #define     TxSelReg              0x16
    #define     RxSelReg              0x17
    #define     RxThresholdReg        0x18
    #define     DemodReg              0x19
    #define     RFU1A                 0x1A
    #define     RFU1B                 0x1B
    #define     MifareReg             0x1C
    #define     RFU1D                 0x1D
    #define     RFU1E                 0x1E
    #define     SerialSpeedReg        0x1F
    // PAGE 2    
    #define     RFU20                 0x20  
    #define     CRCResultRegM         0x21
    #define     CRCResultRegL         0x22
    #define     RFU23                 0x23
    #define     ModWidthReg           0x24
    #define     RFU25                 0x25
    #define     RFCfgReg              0x26
    #define     GsNReg                0x27
    #define     CWGsCfgReg            0x28
    #define     ModGsCfgReg           0x29
    #define     TModeReg              0x2A
    #define     TPrescalerReg         0x2B
    #define     TReloadRegH           0x2C
    #define     TReloadRegL           0x2D
    #define     TCounterValueRegH     0x2E
    #define     TCounterValueRegL     0x2F
    
    // PAGE 3      
    #define     RFU30                 0x30
    #define     TestSel1Reg           0x31
    #define     TestSel2Reg           0x32
    #define     TestPinEnReg          0x33
    #define     TestPinValueReg       0x34
    #define     TestBusReg            0x35
    #define     AutoTestReg           0x36
    #define     VersionReg            0x37
    #define     AnalogTestReg         0x38
    #define     TestDAC1Reg           0x39  
    #define     TestDAC2Reg           0x3A   
    #define     TestADCReg            0x3B   
    #define     RFU3C                 0x3C   
    #define     RFU3D                 0x3D   
    #define     RFU3E                 0x3E   
    #define     RFU3F		  		        0x3F
    
    
    //和MF522通讯时返回的错误代码
    #define 	MI_OK                 0
    #define 	MI_NOTAGERR           1
    #define 	MI_ERR                2
    
    #define	SHAQU1		0X01
    #define	KUAI4			0X04
    #define	KUAI7			0X07
    #define	REGCARD		0xa1
    #define	CONSUME		0xa2
    #define READCARD	0xa3
    #define ADDMONEY	0xa4
    
    /*
        RC522各种驱动函数
    */
    u8 RC522_SPI_ReadWriteOneByte(u8 tx_data);
    void RC522_IO_Init(void);
    u8 RC522_MFRC522_SelectTag(u8 *serNum);
    void RC522_Delay(u32 ns);
    void RC522_Init(void);
    void RC522_Reset(void);
    char RC522_PcdRequest(u8 req_code,u8 *pTagType);
    char RC522_PcdAnticoll(u8 *pSnr);
    char RC522_PcdSelect(u8 *pSnr);
    char RC522_PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr);
    char RC522_PcdRead(u8 addr,u8 *p);
    char RC522_PcdWrite(u8 addr,u8 *p);
    char RC522_PcdHalt(void);
    void RC522_CalulateCRC(u8 *pIn ,u8 len,u8 *pOut );
    char RC522_PcdReset(void);
    char M500PcdConfigISOType(u8 type);
    char M500PcdConfigISOType(u8 type);
    u8 RC522_ReadRawRC(u8 Address);
    void RC522_WriteRawRC(u8 Address,u8 value);
    void RC522_SetBitMask(u8 reg,u8 mask) ;
    void RC522_ClearBitMask(u8 reg,u8 mask);
    char RC522_PcdComMF522(u8 Command,u8 *pIn,u8 InLenByte,u8 *pOut,u8 *pOutLenBit);
    void RC522_PcdAntennaOn(void);
    void RC522_PcdAntennaOff(void);
    #endif
    
    

     

    展开全文
  • 里面的工具很全了。读取 分析 加解密 写入 锁uid 改uid 改数据
  • IC客栈数据对比

    2018-11-24 14:47:29
    IC卡分析助手,用于分析IC卡两组数据用的软件,实用性强。
  • IC卡读卡程序demo

    2017-09-06 10:34:41
    IC卡读卡程序demo,包括身份证的读取程序开发所需的demo程序。如果用的是新卡,就用的默认出厂密码如果卡片的某扇区在出厂后曾被修改过密码,就在上述区域填入新密码后,才能读写改扇区; 每个扇区都有一套独立的...
  • IC卡DUMP和txt互转工具

    2020-07-04 01:31:41
    IC卡读出来的数据转换成txt方便编辑修改
  • IC卡的简介

    2018-01-03 11:56:09
    IC卡即集成电路卡(Integrated Circuit Card),是超大... 按照与外界数据传送的形式来分,IC卡分为接触式和非接触式:接触式IC卡的芯片金属触点暴露在外,可以直观看见,数据存储在卡体内嵌的集成电路(IC)中,通过芯

        IC卡即集成电路卡(Integrated Circuit Card),是超大规模集成电路技术、计算机技术以及信息安全技术等发展的产物。它将集成电路芯片镶嵌于塑料基片的指定位置上,利用集成电路的可存储特性,保存、读取和修改芯片上的信息。

        按照与外界数据传送的形式来分,IC卡分为接触式和非接触式:接触式IC卡的芯片金属触点暴露在外,可以直观看见,数据存储在卡体内嵌的集成电路(IC)中,通过芯片上的8个触点可与读写设备接触、交换信息。目前两种最常用的接触类型的是存储卡和CPU卡,存储卡只能存储256b到128kb的数据,而CPU卡在存储数据的同时还可以进行运算操作;非接触卡,又称“无触点IC卡”或“射频卡”。他的芯片全部封于卡基内,无暴露部分,不但如此,在卡体内还嵌有一个微型天线,是为了嵌入的芯片与读卡器之间相互通信。它成功地将射频识别技术和IC技术结合起来,该技术的优势是信息的交换不需要卡和读卡器之间有任何接触。该中卡的存储容量一般在256b到72kb之间。加密性能好,非接触IC卡的序列号是唯一的,由制造厂家固化而不可更改。卡中各扇区都有自己的操作密码和访问条件,卡与读写器之间采用双向验证机制,而且通讯过程中所有数据都加密,所以它很适用于电子钱包、公路自动收费系统和公交自动售票系统等。

        按照卡内集成电路(嵌装的芯片)的不同,IC卡可分为存储器卡、逻辑加密卡和CPU卡:存储器卡适合仅以IC卡作为数据的的转存介质或有软件加密而不担心被篡改的系统,价格较低;逻辑加密卡通过设置卡上的密码区域来控制卡的读写,价格适中;CPU卡又名“智能卡”,卡的集成电路中带有微处理器,自身就可以进行数据计算和信息处理,同时能够利用随机数和密钥进行卡与设备的相互验证,安全性高,价格稍高。

        

    展开全文
  • IC卡

    2016-09-26 19:43:00
    IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card)、智慧卡(Intelligent card)、微电路卡(Microcircuit card)或微芯片卡等。它是将一个微电子芯片嵌入符合ISO 7816标准的卡基中,做成卡片形式。...
  • 贴一下的那种卡应该叫“非接触”吧 没有铜片的那种 看网上卖读写器 先不讨论道德法律层面 ...对于那种信息不及时上传的ic卡 能做到改写数据吗 无水表 不网购
  • IC卡操作软件V1.26.rar

    2020-06-09 16:10:27
    IC卡多扇区操作软件,修改数据,清除卡片数据和密码,读写修改UID的卡号和数据,编辑修改dump文件。支持Acr122u读写器
  • 其中,我们把只读(只能通过读卡器读出卡号(ID号),而且卡号是固化的(不能修改),不能往的分区再写数据,这种非接触,我们简称ID。EM(芯片厂家)的ID拥有ID绝对的占有率,性价比最好,所以又叫EM...
  • 电梯数据读取和相关修改!门禁复制延期 ,NFC使用 ,IC复制延期 ,日期延期,加密解密 ,算法 ,解密
  • 无意中发现的一个电梯数据分析工具,不错可以直接延期电梯时间。支持常见的很多系统 等等百达梯控 百达ABC系统 天宇系统 安居宝门禁 鼎博门禁 百达门禁系统 东芝梯控2 东芝梯控3 大华1系统 精创梯控5 精创梯控6 ...
  • 非接触式IC卡:门禁卡、工卡 条码卡:较少接触到 磁道卡:带黑色磁条的卡,如可刷的银行卡 接触式IC卡:(即芯片卡),卡片嵌套了类似电话sim卡,如新一代的银行芯片卡 一、最新技术—...
  • 晶创智能电梯IC卡管理系统软发卡修改物业系统点击安装文件后以及安装完毕首次运行软件,系统会花费几秒钟的时间进行后台数据处理,请耐心等待。 晶创智能电梯IC卡管理系统软发卡修改物业系统点击安装文件后以及安装...
  • ISO/IEC 7816-3标准中对ATR的数据串和数据元做了规定和描述。ATR的数据元和它们的意义: 数据元 说明 TS 起始字符 T0 格式字符 TA1,TB1,TC1,TD1,... ...
  • IC卡读取服务

    2021-02-23 08:39:29
    在门禁卡录入时,需要实时显示读卡器读到的卡号,由于读卡器厂商比较多,门禁管理系统要做兼容比较繁琐,所以可以实现一个IC卡读取服务和读卡器交互,将交互的数据反馈到输入框。 功能特点: 门禁管理系统无须做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,296
精华内容 3,318
关键字:

修改ic卡数据