news 2026/4/29 17:14:21

STM32 RC522门禁卡数据读写实战:如何用手机NFC模拟门禁卡并写入数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 RC522门禁卡数据读写实战:如何用手机NFC模拟门禁卡并写入数据

STM32与RC522实战:从门禁卡数据解析到手机NFC模拟全指南

当你用门禁卡轻轻一刷,背后究竟发生了什么?这张看似简单的卡片内部藏着怎样的数据结构?本文将带你深入Mifare Classic卡片的世界,通过STM32和RC522模块实现完整的卡片数据读写操作,并探索如何用手机NFC功能模拟门禁卡——这不仅是技术实现,更是一次对射频识别技术的深度解密。

1. RC522与Mifare Classic卡片基础解析

RC522作为13.56MHz射频识别模块中的性价比之王,其SPI接口与STM32的配合堪称经典组合。但真正让这套系统运作起来的,是Mifare Classic卡片(S50)独特的存储结构。每张卡片拥有1KB存储空间,划分为16个扇区,每个扇区又包含4个块(Block 0-3),其中:

块类型功能说明典型用途
Block 0厂商信息块包含不可更改的UID和厂商数据
Block 1-2数据块存储用户自定义信息
Block 3密钥控制块存储A/B密钥和访问控制位

关键点在于Block 3的访问控制,它决定了各块的读写权限。典型的控制字节配置如下:

// 典型门禁卡控制字节示例 uint8_t default_access_bits[4] = {0xFF, 0x07, 0x80, 0x69};

这个配置意味着:

  • 密钥A永远可读(用于验证)
  • 数据块需要密钥A验证后才能读写
  • 密钥B被设置为不可读取(保护密钥安全)

2. STM32硬件环境搭建

2.1 硬件连接与CubeMX配置

使用STM32F103C8T6最小系统板与RC522模块连接时,SPI配置尤为关键:

  1. SPI模式选择:Full-Duplex Master
  2. 时钟分频:建议256分频(约281.25kHz)
  3. 引脚分配
    • PA4 -> NSS(CS)
    • PA5 -> SCK
    • PA6 -> MISO
    • PA7 -> MOSI
    • PA3 -> RST

注意:RC522的IRQ引脚可不接,大多数应用场景不需要中断功能

2.2 底层驱动实现

建立稳定的SPI通信是第一步,以下是核心读写函数:

// SPI单字节读写 uint8_t RC522_SPI_ReadWrite(uint8_t data) { uint8_t ret; HAL_SPI_TransmitReceive(&hspi1, &data, &ret, 1, 100); return ret; } // 寄存器写入 void RC522_WriteReg(uint8_t addr, uint8_t val) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); RC522_SPI_ReadWrite((addr<<1)&0x7E); RC522_SPI_ReadWrite(val); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); }

3. 卡片数据操作实战

3.1 UID读取与扇区遍历

卡片识别的基本流程遵循ISO14443-3标准:

  1. 寻卡:发送REQA/WUPA命令
  2. 防冲突:获取UID
  3. 选卡:激活特定卡片

实现代码示例:

char PCD_GetUID(uint8_t *uid) { char status; uint8_t buffer[2]; // 寻卡 status = PCD_Request(PICC_REQALL, buffer); if(status != PCD_OK) return status; // 防冲突获取UID status = PCD_Anticoll(uid); if(status != PCD_OK) return status; return PCD_OK; }

3.2 扇区数据读写详解

读数据块流程

  1. 验证扇区密钥
  2. 发送读命令+块地址
  3. 接收16字节数据
char PCD_ReadBlock(uint8_t sector, uint8_t block, uint8_t *data) { uint8_t cmd[2]; uint16_t len; uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 默认密钥 // 验证密钥 if(PCD_Auth(PICC_AUTHENT1A, sector*4+block, key, uid) != PCD_OK) return PCD_ERR; // 发送读命令 cmd[0] = PICC_READ; cmd[1] = sector*4 + block; return MFRC_Transceive(cmd, 2, data, &len); }

写数据块特别注意

  • 不能直接写Block 3(控制块)
  • 写操作前必须验证密钥
  • 建议先读后写,避免覆盖重要数据

4. 手机NFC模拟实战

4.1 安卓手机模拟方案

使用Mifare Classic Tool(MCT)等APP可以实现:

  1. 卡片克隆

    • 读取原卡所有扇区
    • 将dump文件写入空白CUID卡
    • 手机模拟该CUID卡
  2. 数据修改技巧

    • 修改用户信息块(通常为Block 1)
    • 保持控制块不变
    • 保留原厂UID块

重要提示:大多数手机无法完整模拟Mifare Classic卡,建议使用NTAG215等可写标签作为中介

4.2 iOS设备限制与解决方案

由于iOS的NFC限制:

  1. 使用NFC Tools Pro等APP
  2. 只能读取NDEF格式数据
  3. 解决方案:
    • 将门禁卡信息编码为NDEF
    • 通过HomeKit桥接
    • 使用苹果钱包的学生证/门禁卡功能

5. 安全增强与实战技巧

5.1 动态密钥生成算法

提升安全性的关键方法:

// 基于UID的动态密钥生成 void generate_dynamic_key(uint8_t *uid, uint8_t *key) { for(int i=0; i<6; i++) { key[i] = (uid[i%4] + i*17) ^ 0x55; } }

5.2 数据加密存储方案

建议存储格式:

偏移量长度内容加密方式
0x004用户IDAES-128
0x044有效日期异或加密
0x084权限标志明文存储

5.3 常见问题排查

读卡失败可能原因

  1. 天线匹配电路失调 - 检查22pF匹配电容
  2. SPI时钟过快 - 降至<1MHz
  3. 卡片类型不匹配 - 确认是Mifare Classic S50
  4. 密钥错误 - 尝试默认密钥FFFFFFFFFFFF

写入异常处理步骤

  1. 验证密钥是否正确
  2. 检查块地址是否有效(非控制块)
  3. 确认卡片是否处于只读模式
  4. 测量VCC电压(应在3.3V±10%)

通过这套系统,我们不仅实现了基础的门禁功能,更构建了一个可扩展的RFID应用平台。在实际项目中,我曾遇到一个有趣的案例:某小区门禁系统通过Block 1的第3字节表示用户楼层,只需修改这个字节就能实现"电梯直达"功能——当然,这需要物业的合法授权。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 17:13:18

图神经网络迁移学习智能故障诊断【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 如需沟通交流&#xff0c;扫描文章底部二维码。&#xff08;1&#xff09;切比雪夫距离加权图构建&#xff1a;从振动信号提取多频带幅…

作者头像 李华
网站建设 2026/4/29 17:11:13

从ViT到PVT:SRA模块如何让Transformer在CV任务上‘瘦身’成功?

从ViT到PVT&#xff1a;SRA模块如何让Transformer在CV任务上‘瘦身’成功&#xff1f; 当Vision Transformer&#xff08;ViT&#xff09;首次将Transformer架构引入计算机视觉领域时&#xff0c;它展现出了媲美甚至超越传统CNN的性能。然而&#xff0c;随着图像分辨率的提升&a…

作者头像 李华
网站建设 2026/4/29 17:03:57

League Akari终极指南:如何用智能工具提升英雄联盟游戏体验

League Akari终极指南&#xff1a;如何用智能工具提升英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了英雄联盟中…

作者头像 李华
网站建设 2026/4/29 17:00:04

PvZ Toolkit终极指南:如何轻松掌控植物大战僵尸的游戏体验

PvZ Toolkit终极指南&#xff1a;如何轻松掌控植物大战僵尸的游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中阳光不足而烦恼吗&#xff1f;想要保存精心布置的阵型却…

作者头像 李华
网站建设 2026/4/29 16:54:07

mysql如何防范SQL攻击引起的账号被封_配置自动解锁机制

MySQL账号被封主因是触发max_connect_errors阈值&#xff08;默认100次失败连接&#xff09;&#xff0c;导致自动锁死而非人为禁用&#xff1b;可通过SHOW VARIABLES、SELECT account_locked及错误日志排查&#xff0c;并需FLUSH HOSTS或RESET CONNECTION手动解锁。MySQL账号被…

作者头像 李华