找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5455|回复: 8
收起左侧

STM32 RFID-RC522修改卡的密码?求指教

[复制链接]
ID:511461 发表于 2019-10-19 15:45 | 显示全部楼层 |阅读模式
      近期,在RFID-RC522模块,能够读取卡的ID,也会向卡读写数据,但关于修改密码方面,不是很懂,希望大神能指教一番。


#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_usart1.h"
#include "rc522_config.h"
#include "rc522_function.h"
#include <stdbool.h>
#include "bsp_lcd.h"



void IC_test ( void )
{
        char cStr [ 30 ];
  u8 ucArray_ID [ 4 ];                                                                                             //先后存放IC卡的类型和UID(IC卡序列号)
        u8 ucStatusReturn;                                                                                               //返回状态
  static u8 ucLineCount = 0;
               
  while ( 1 )
  {
                if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )                                    //寻卡
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                                                                 //若失败再次寻卡

                if ( ucStatusReturn == MI_OK  )
                {
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                   //防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)
                        {
                                sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );                                
                                printf ( "%s\r\n",cStr );
                                ucLineCount ++;
                                
                                if ( ucLineCount == 17 ) ucLineCount = 0;                                                               
                        }                        
                }
  }        
}




/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main ( void )
{
        SysTick_Init ();   //滴答时钟初始化
        
        USART1_Config ();  //USART1 配置模式为 115200 8-N-1,中断接收
        
        RC522_Init ();     //RC522模块所需外设的初始化配置

        printf ( "WF-RC522 Test\n" );
               
        PcdReset ();
        M500PcdConfigISOType ( 'A' );//设置工作方式
        
        
  while ( 1 )
  {
    IC_test ();//IC卡检测        
                //printf ( "11111111111");
  }        
}

读卡器stm32RCT6.7z

210.6 KB, 下载次数: 39

回复

使用道具 举报

ID:174087 发表于 2019-10-21 17:16 | 显示全部楼层
S50卡的密码存放在每个扇区的第三块,想要修改扇区密码要先确保KEYA和KEYB是默认的,然后使用默认密码去进行读写,读写操作步骤和向卡写数据的步骤是一样的,需要先验证密码,注意不要修改到密码控制字节,否则可能将该扇区锁死
回复

使用道具 举报

ID:235200 发表于 2019-10-21 22:19 | 显示全部楼层
有两个密码,分别是密码A和密码B,根据第3块的存取控制能够对密码A或密码B进行修改,但不是任何一个存取控制都能修改密码,如C13 C23 C33为010 110 101 111 不能修改密码A和密码B  
回复

使用道具 举报

ID:511461 发表于 2019-10-23 19:09 | 显示全部楼层
修改密码的我会了,但是我发现我修改了A的密码,比如说改为存在NEWKEY数组里,但是此时我的B的密码就不是他之前的密码了,我也不知道改为啥了,试了A的新密码也不对
回复

使用道具 举报

ID:511461 发表于 2019-10-23 19:11 | 显示全部楼层
但是我改完B的密码,存在NEWKEYB数组里,此时A的密码也变了,也不是之前的了,变成B的新密码了,
嗯。。,我说的比较绕,但就是这个意思,希望有大佬帮忙解决一下
回复

使用道具 举报

ID:174087 发表于 2019-10-24 11:49 | 显示全部楼层
aaaaaa。 发表于 2019-10-23 19:09
修改密码的我会了,但是我发现我修改了A的密码,比如说改为存在NEWKEY数组里,但是此时我的B的密码就不是他 ...

你用来存放密码的数组多大的,修改密码时必须是密码A密码B控制字全部写进去,也就是你的数组格式应该是【新的密码A控制字新的密码B】,这样写进去才会是你想要的密码,不然的话另一个密码就是0或者乱码
回复

使用道具 举报

ID:511461 发表于 2019-10-24 13:01 | 显示全部楼层
这是总的程序
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "rc522_function.h"
#include "rc522_config.h"


//u8 KEYA[6]={8,8,8,8,8,8};   //管理员卡秘钥A (管理员权限)
//u8 KEYB[6]={6,5,4,3,2,1};   //管理员卡秘钥B (管理员权限)
u8 KEYA[6]={0xff,0xff,0xff,0xff,0xff,0xff};

u8 NEWKEYA[6]={1,2,3,4,5,6};
u8 NEWKEYB[6]={0x11,0x22,0x33,0x44,0x55,0x66};
u8 NEW[6]={0x66,0x55,0x44,0x33,0x22,0x11};
u8 KEYB[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 writedata[6]={0x11,0x26,0x11,0x28};
u8 ucArray_ID [ 4 ];
u8 pdataread[10];



int KEYA_in(int block)//选定卡片并输出密码A,///输入卡片块地址(0-63)
{
        u8 pan,bat,cad;
        PcdSelect(ucArray_ID);//选定卡片
        pan=0;
        printf("正在输入密码..............\r\n");
        pan=PcdAuthState(0x60, block ,NEWKEYB,ucArray_ID);//输入密码
        if(pan==0x26)
        {
                printf("密码正确\r\n");
          //PcdWrite(block+1,NEWKEYB);                return 1;
        }
        else
        {
                printf("密码错误\r\n");
                return 0;
        }
}

void KEYB_in(int block)//选定卡片并输出密码A,///输入卡片块地址(0-63)
{
        int t=0;
        u8 pan;
        PcdSelect(ucArray_ID);//选定卡片
        t=0;
        pan=0;
        printf("正在输入密码..............\r\n");
        while(t<5&&pan!=0x26)
        {
                t++;
                pan=PcdAuthState(0x61, block ,NEWKEYB,ucArray_ID);//输入密码
        }
        if(pan==0x26)
        {
                printf("SUCCESS\r\n");
                //PcdWrite(block+1,NEWKEYB);
        }
        else
        {
                printf("FAIL\r\n");
        }
}


void write_kuai(int address,u8 * pdata)//在一个块写数据
{
        u8 pan=0;
        printf("正在对块%d写入数据..............\r\n",address);       
        pan=PcdWrite(address,pdata);
        if(pan==0x26)
        {
                printf("写入成功\r\n");
        }
        else
        {
                printf("写入失败\r\n");
        }
}


void read_kuai(int address)//读出数据块并打印数据到串口
{
        u8 pan=0;
        char num[10];
        //u8 unum[10];
        printf("正在对扇区%d读取数据..............\r\n",address);       
        pan=PcdRead(address,pdataread);
        sprintf (num,"%2X%2X%2X%2X",pdataread [ 0 ],pdataread [ 1 ],pdataread [ 2 ],pdataread [ 3 ]);
        //unum[0]=num[0];unum[1]=num[1];unum[2]=num[2];unum[3]=num[3];unum[4]=num[4];unum[5]=num[5];unum[6]=num[6];unum[7]=num[7];
        if(pan==0x26)
        {
                printf("读取成功\r\n数据为%s\r\n",num);
        }
        else
        {
                printf("读取失败\r\n");
        }
}

u8 IC_test ( void )
{
        char cStr [ 30 ];
  //u8 ucArray_ID [ 4 ];                                                                                             //先后存放IC卡的类型和UID(IC卡序列号)
        u8 ucStatusReturn;                                                                                               //返回状态
  static u8 ucLineCount = 0;
               
  while ( 1 )
  {
                if( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )       //寻卡
                {
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                                  //若失败再次寻卡
                }
                if ( ucStatusReturn == MI_OK  )
                {
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )         //防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)
                        {
                                sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );
                                                               
                                printf ( "%s\r\n",cStr );                                
                                ucLineCount ++;                               
                                if ( ucLineCount == 17 ) ucLineCount = 0;       
        return 1;                               
                        }                       
                }               
  }       
}

int main(void)
{
   u8 flag=0;
        delay_init();                     //延时函数初始化          
        uart_init(115200);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        //LCD_Init();
       
        RC522_Init ();     //RC522模块所需外设的初始化配置         

        printf ( "WF-RC522 Test\r\n" );
               
        PcdReset ();
        M500PcdConfigISOType ( 'A' );//设置工作方式
        while(1)
        {
                 flag=IC_test ();
     if(flag==1)//IC卡检测,返回UID
                 {
                         flag=0;
                         KEYA_in(26);
                         //KEYB_in(26);
//                         write_kuai(1,writedata);
//                         read_kuai(1);
                 }       
                 LED0=!LED0;         
                 delay_ms(1000);       
        }
}

以下只是修改密码那部分的内容
u8 KEYA[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 NEWKEYA[6]={1,2,3,4,5,6};
u8 NEWKEYB[6]={0x11,0x22,0x33,0x44,0x55,0x66};
u8 KEYB[6]={0xff,0xff,0xff,0xff,0xff,0xff};

int KEYA_in(int block)//选定卡片并输出密码A,///输入卡片块地址(0-63)
{
        u8 pan,bat,cad;
        PcdSelect(ucArray_ID);//选定卡片
        pan=0;
        printf("正在输入密码..............\r\n");
        pan=PcdAuthState(0x60, block ,NEWKEYB,ucArray_ID);//输入密码
        if(pan==0x26)
        {
                printf("密码正确\r\n");
          //PcdWrite(block+1,NEWKEYB);                return 1;
        }
        else
        {
                printf("密码错误\r\n");
                return 0;
        }
}

KEYA_in(6);   // 修改的是第二扇区的密码,也就是对数据块7进行修改,修改密码的数组长度为6,里面存储着A的新密码,
大佬,那你的意思是不是如果要修改密码,就定义一个长度为16的数组,其中A占前六个,中间4个为控制字,后6个是B的新密码,是不是这样子呢??如果是的话,那在修改密码前,进行验证的时候,是不是A和B的原密码都要验证呢??是先A后B,还是和修改时一样,定义长度为16的数组,一起验证


回复

使用道具 举报

ID:235200 发表于 2019-10-24 13:03 | 显示全部楼层
woshige 发表于 2019-10-24 11:49
你用来存放密码的数组多大的,修改密码时必须是密码A密码B控制字全部写进去,也就是你的数组格式应该是【 ...

建立16个元素的数组,A密码存在0-5 控制字存在6-9,B密码存在10-15,修改A密码时,第6-15的元素不能改,然后整个数组写入某扇区的第3块即可
回复

使用道具 举报

ID:511461 发表于 2019-10-24 20:15 | 显示全部楼层
csmyldl 发表于 2019-10-24 13:03
建立16个元素的数组,A密码存在0-5 控制字存在6-9,B密码存在10-15,修改A密码时,第6-15的元素不能改,然后整 ...

那修改之前还要进行验证的吧,验证的时候要对A和B扇区都要验证吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表